我在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));
}
);
}
});