我在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
参数是因为在范围内,我只有上载文件的元数据,而没有文件内容。
答案 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));
}
);
}
});