如何在multer中检查文件类型

Posted

技术标签:

【中文标题】如何在multer中检查文件类型【英文标题】:how to check file type in multer 【发布时间】:2021-04-08 18:37:56 【问题描述】:

我正在使用 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 && 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 && 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 ;

【讨论】:

以上是关于如何在multer中检查文件类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 multer 上传多个文件,但来自不同的字段?

如果未使用 multer 在 nodejs 中选择文件,则不更新

nodejs Multer中间件

Multer 为使用 ReactJS 上传的文件返回 `undefined`

nodejs--express的中间件multer实现图片文件上传--XUEBIG

如何在c#中检查url是文件类型还是网页类型?