按文件类型过滤使用 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 检查文件扩展名,而不是取决于其编码的真实文件类型。例如,我已经看到存在一些检查文件真实类型的模块,即这个(我只在谷歌上搜索过它,我没有测试它(,但我不能在filefilter参数中使用此模块,因为在范围内我只有上传文件的元数据,但没有文件内容。

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

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

您需要将文件存储在磁盘上,以便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));
}
);
}
});

最新更新