как проверить тип файла в multer

#javascript #node.js #reactjs #multer #cloudinary

#javascript #node.js #reactjs #мультер #cloudinary

Вопрос:

Я работаю над проектом в React и столкнулся с проблемой, которая поставила меня в тупик.

Я хочу загрузить свой файл в cloudinary, а также хочу проверить свой тип файла и тип mime, но столкнувшись с этой ошибкой, это мой код

итак, вот мой код, и я не могу отфильтровать тип файла.

если у кого-то есть какое-то решение, будет действительно здорово, если вы мне поможете

 const multer = require("multer");
const DatauriParser = require("datauri/parser");
const path = require("path");
const fs = require("fs");
const dontenv = require("dotenv");
dontenv.config({ path: "config.env" });

let storage;
let dataUri;
const parser = new DatauriParser();

if (process.env.STORAGE_TYPE == "cloud") {
    storage = multer.memoryStorage();
    dataUri = (req) =>
        parser.format(
            path.extname(req.file.originalname).toString(),
            req.file.buffer
        );
} else {
    dataUri = {};
    storage = multer.diskStorage({
        destination: function (req, file, cb) {
            var directory = process.env.STORAGE;
            if (!fs.existsSync(directory)) {
                fs.mkdirSync(directory);
            }
            cb(null, directory);
        },
        filename: function (req, file, cb) {
            cb(
                null,
                file.fieldname  
                    "-"  
                    Date.now()  
                    "."  
                    file.originalname.split(".")[1]
            );
        },
        fileFilter: function (req, file, cb) {
            checkFileType(file, cb);
        },
  });
  
    function checkFileType(file, cb) {
        // Allowed ext
        const filetypes = /jpeg|jpg|png|gif/;
        // Check ext
        const extname = filetypes.test(         
            path.extname(req.file.originalname).toString()
        );
        // Check mime
        const mimetype = filetypes.test(file.mimetype);

        if (mimetype amp;amp; extname) {
            return cb(null, true);
        } else {
            cb("Error: Images Only!");
        }
    }

    // to Check File TYpe
}

const multerUploads = multer({ storage: storage }).single("imageUrl");

module.exports = { multerUploads, dataUri };


 

Я понятия не имею, почему это происходит, если кто-нибудь испытал это, я был бы благодарен.

Ответ №1:

Прежде всего fileFilter , это не ключ diskStorage , это ключ самого multer. Кроме того, вы объявили функцию внутри else . Таким образом, проверка типа файла с помощью multer должна быть такой:

 const multer = require("multer");
const DatauriParser = require("datauri/parser");
const path = require("path");
const fs = require("fs");
const dontenv = require("dotenv");
dontenv.config({ path: "config.env" });

let storage;
let dataUri;
const parser = new DatauriParser();

if (process.env.STORAGE_TYPE == "cloud") {
    storage = multer.memoryStorage();
    dataUri = (req) =>
        parser.format(
            path.extname(req.file.originalname).toString(),
            req.file.buffer
        );
} else {
    dataUri = {};
    storage = multer.diskStorage({
        destination: function (req, file, cb) {
            var directory = process.env.STORAGE;
            if (!fs.existsSync(directory)) {
                fs.mkdirSync(directory);
            }
            cb(null, directory);
        },
        filename: function (req, file, cb) {
            cb(
                null,
                file.fieldname  
                "-"  
                Date.now()  
                "."  
                file.originalname.split(".")[1]
            );
        }
    });
    // to Check File TYpe
}

function checkFileType(file, cb) {
    // Allowed ext
    const filetypes = /jpeg|jpg|png|gif/;
    // Check ext
    const extname = filetypes.test(
        path.extname(file.originalname).toString()
    );
    // Check mime
    const mimetype = filetypes.test(file.mimetype);

    if (mimetype amp;amp; extname) {
        return cb(null, true);
    } else {
        cb("Error: Images Only!");
    }
}

const multerUploads = multer({
    storage: storage,
    fileFilter: function (req, file, cb) {
        checkFileType(file, cb);
    },
}).single("imageUrl");

module.exports = { multerUploads, dataUri };