我遇到了multer,并上传到S3: 我将通过以下方式发送5张图片:
app.post(
'/upload',
upload.fields(
[
{ name: 'image', maxCount: 1 },
{ name: 'image2', maxCount: 1 },
{ name: 'image3', maxCount: 1 },
{ name: 'image4', maxCount: 1 },
{ name: 'image5', maxCount: 1 }
]),
(req, res, next) => {
res.status(200).send('Files uploaded successfully.')
});
使用以下multer实现:
var upload = multer({
storage: multerS3({
s3: s3,
bucket: myBucket,
fileFilter: (res, file, callback) => {
var ext = path.extname(file.originalname);
if(ext !== '.png' && ext !== '.jpg' && ext !== '.jpeg') {
res.status(400).send('Only images are allowed')
}
callback(null, true)
},
acl: 'public-read',
contentType: multerS3.AUTO_CONTENT_TYPE,
key: function (req, file, cb) {
uuidFileName = uuidv4();
fileNamesArray.push(uuidFileName);
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('Only image files are allowed!'));
}
cb(null, uuidFolderName + '/' + uuidFileName + '.' + mime.getExtension(file.mimetype))
}
})
})
我的问题是,例如,当客户端将第五张图像作为PDF发送时,已经有4张图像上传到S3。尽管删除它们并取消整个过程效率不高,但我一直在研究multer的多重上传选项,但没有成功,而且也没有保证会在上传第一个之前真正阻止。
有什么想法吗?
答案 0 :(得分:0)
首先,在前端部分,您可以使用输入标签的accept属性指定上载按钮接受的MIME类型。
在背面,您可以使用express-fileupload,获取mime类型或文件名,并在文件不匹配时返回错误。
示例:
const fileUpload = require('express-fileupload');
const customCheckFiles = (req, res, next) => {
const fileNames = Object.keys(req.files).map(key => req.files[key].name);
return fileNames.every(filename => !!filename.match(/\.(jpg|jpeg|png|gif)$/))
? next() // let multer do the job
: res.status(400).json({error: "Wrong image formats"});
}
app.post(
'/upload',
fileUpload(),
customCheckFiles
upload.fields(
[
{ name: 'image', maxCount: 1 },
{ name: 'image2', maxCount: 1 },
{ name: 'image3', maxCount: 1 },
{ name: 'image4', maxCount: 1 },
{ name: 'image5', maxCount: 1 }
]),
(req, res, next) => {
res.status(200).send('Files uploaded successfully.')
});
我没有测试代码,仅作为示例。
希望有帮助,
最好的问候