NodeJS - проверить расширение перед загрузкой нескольких файлов с помощью multer? - PullRequest
0 голосов
/ 29 августа 2018

Я столкнулся с 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.')
});

Использование следующей многоуровневой реализации:

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. Хотя их удаление и отмена всего процесса неэффективны, Ive изучал возможность множественной загрузки мультитера, но безуспешно, и нет никаких обещаний, которые он действительно предотвратит перед загрузкой первого.

Есть идеи?

1 Ответ

0 голосов
/ 29 августа 2018

Во-первых, во внешней части вы можете указать тип MIME, который принимает ваша кнопка загрузки, с атрибутом accept тега input.

На обороте вы можете использовать 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.')
});

Я не тестировал код, он просто служит примером.

Надеюсь, это поможет,
С наилучшими пожеланиями

...