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

时间:2018-09-05 11:48:00

标签: node.js multer

我在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(我只在google上搜索过它,而未测试过它),但是我无法在filefilter参数是因为在范围内,我只有上载文件的元数据,而没有文件内容。

1 个答案:

答案 0 :(得分: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));

      }
    );
  }
});