node.js - 如何阻止在multer中上传gif图像?
问题描述
这种 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)
解决方案
如果我像下面这样测试您的代码,我会得到正确的响应,例如“文件必须是图像”。如果我尝试上传 .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 内容处置:表单数据;名称=“图像”;文件名="test.gif" 内容类型:图片/gif
一切都按预期进行。
我建议您不要相信 POST 中的文件名字段,而是通过查看上传的缓冲区来实际检查图像的真实情况。
推荐阅读
- c - C重定向导致scanf不接受输入
- python - 尝试将内容保存到数据库后,在长时间运行的任务中“服务器意外关闭了连接”
- iis - 在开发服务器上设置现有站点,如何将“/some folder/file”直接指向应用程序文件夹而不是服务器根目录?
- google-apps-script - 将 Google 文件发送到电子邮件
- airflow - 如何设置仅在某个 dag_run 期间使用的变量
- azure - 在 Azure 中的大量 VM 上进行 CodedUI 测试
- pandas - Pandas 确实基于字段进行汇总
- python - Jinja2 - 复制变量而不是引用它
- google-app-engine - 是否可以从另一个项目连接到 Google Cloud Memorystore?
- google-sheets - 如何在 Google 表格中选择正确的范围