此multer配置使我可以上传'.gif'格式的图像。如何解决呢?我希望它仅上传png, jpg, jpeg
这是我的代码:
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/public/images')
},
filename: function (req, file, cb) {
crypto.pseudoRandomBytes(16, function (err, raw) {
cb(null, raw.toString('hex') + Date.now() + '.' + mime.getExtension(file.mimetype));
});
}
});
let upload = multer({
limits: {
fileSize: 1000000
},
fileFilter: function(req, file, cb) {
if(!file.originalname.match(/\.(jpg|jpeg|png)$/)){
return cb('File must be an image.');
}
cb(undefined, true);
},
storage: storage
});
路线:
app.post('/upload-ad', upload.any(), recaptcha.middleware.verify, (req, res)
答案 0 :(得分:0)
如果我像下面那样测试您的代码,则会得到正确的响应,例如“文件必须是图像。”如果我尝试上传.gif文件。
const request = require("request");
const fs = require("fs");
const options = {
method: "POST",
url: "http://localhost:3300/upload-ad",
headers: {
"Content-Type": "multipart/form-data"
},
formData : {
"image" : fs.createReadStream("./test.gif")
}
};
request(options, function (err, res, body) {
if(err) console.log(err);
console.log(body);
});
之所以可行,是因为在这种情况下我们要设置Content-Disposition字段。我怀疑您正在发生的事情可能是客户端未设置此标头,或者它设置不正确。例如,如果我们将文件名从“ test.gif”更改为“ test.jpg”,尽管它实际上是GIF图像,但可以成功上传。
就我而言,上传开始看起来像这样:
----------------------------321622124424983663382061 Content-Disposition: form-data; name="image"; filename="test.gif" Content-Type: image/gif
一切都会按预期进行。
我建议您最好不要信任POST中的文件名字段,并通过查看上载的缓冲区实际检查图像的真正含义。