按文件类型使用multer过滤文件

问题描述 投票:0回答:1

我在nodejs中使用multer模块上传一些图像(只有tiff和jpg格式)。我想过滤和存储只有tiff和jpg图像。

现在我这样做:

var upload = multer({
     storage: storage,
     fileFilter: function(req, file, cb){
          //---------------------------
          //CHECK IF THE FILE IS IN A CORRECT FORMAT
          //------------------------

          if((file.mimetype == "image/jpeg" || file.mimetype == "image/jpg" || file.mimetype == "image/tiff")){
                //correct format
                return cb(null, true);
           } else{ 
                //wrong format
                return cb(null, false);
           }
}

使用此代码的问题是multer检查文件扩展名,而不是依赖于他的编码的真实文件类型。我已经看到例如存在一些模块,检查文件的真实类型,即this(我只在谷歌搜索它,我没有测试它)但我不能在filefilter param中使用此模块,因为在范围我只有上传文件的元数据,但没有文件内容。

node.js multer
1个回答
0
投票

您可以使用mmmagic来确定实际内容类型。它执行数据检查,而不是仅依赖于文件扩展名来确定内容类型。

node.js的异步libmagic绑定,用于通过数据检查检测内容类型。

您需要将文件存储在磁盘上以供mmmagic检查内容。

'use strict';

let multer = require('multer');
let fs = require('fs-extra');

let UPLOAD_LOCATION = path.join(__dirname, 'uploads');
fs.mkdirsSync(UPLOAD_LOCATION);

let upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, callback) => {
      callback(null, UPLOAD_LOCATION);
    },
    filename: (req, file, callback) => {
      //originalname is the uploaded file's name with extn
      console.log(file.originalname);
      callback(null, file.originalname);
    }
  }),
  fileFilter: function fileFilter(req, file, cb) {

    let mmm = require('mmmagic'),
      Magic = mmm.Magic;

    let magic = new Magic(mmm.MAGIC_MIME_TYPE);
    let fileNameWithLocation = path.join(UPLOAD_LOCATION, file.originalname);

    magic.detectFile(fileNameWithLocation, function (err, mimeType) {
        if (err) {
          cb(err)
        }

        const ALLOWED_TYPES = [
          'image/jpeg',
          'image/jpg',
          'image/tiff'
        ];

        console.log(`mimeType => ${mimeType}`);
        cb(null, ALLOWED_TYPES.includes(mimeType));

      }
    );
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.