NodeJS - проверить расширение перед загрузкой нескольких файлов с помощью multer?
Я столкнулся с 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 ответ
Во-первых, во внешней части вы можете указать, какой тип 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.')
});
Я не тестировал код, он просто служит примером.
Надеюсь, поможет,
С наилучшими пожеланиями