1

我遇到了 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 的多次上传选项但没有成功,并且没有承诺它会在上传第一个之前实际阻止。

有任何想法吗?

4

1 回答 1

0

首先,在前端部分,您可以使用输入标签的接受属性指定上传按钮接受的 MIME 类型。

在背面,您可以使用express-fileupload,获取 mime-types 或只是文件的名称,并在它们不匹配时返回错误。

例子 :

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.')
});

我没有测试代码,它只是作为示例。

希望它有帮助,
最好的问候

于 2018-08-29T14:50:02.367 回答