Как проверить mimetype нескольких файлов из функции multer.array? - PullRequest
0 голосов
/ 23 сентября 2018

Я работал над этим часами и до сих пор не могу найти решение!Мой оригинальный код должен проверить mimetype одного изображения, загруженного с помощью multer, и он работает хорошо, но у меня возникают проблемы с применением этого кода к нескольким изображениям.Я не уверен, что я даже подхожу к этому правильному пути и, возможно, придется придумать новый подход.Пожалуйста, смотрите код ниже:

Middleter Middleware

const multerOptions = {
    storage: multer.memoryStorage(),
    fileFilter(req, file, next) {
        const isPhoto = file.mimetype.startsWith('image/');
        if(isPhoto) {
            next(null, true);
        } else {
            next({ message: 'That filetype isn\'t allowed!'}, false);
        }
    }
};

Функция оригинального Multer для одного изображения

exports.upload = multer(multerOptions).single('photo');

exports.resize = async (req, res, next) => {
    // check if there is no new file to resize
    if (!req.file) {
        next(); // skip to the next middleware
        return;
    } 
    const extension = req.file.mimetype.split('/')[1];
    req.body.photo = `${uuid.v4()}.${extension}`;
    // resize the image
    const photo = await jimp.read(req.file.buffer);
    await photo.resize(800, jimp.AUTO);
    await photo.write(`./public/uploads/${req.body.photo}`);
    next();
};

Новая функция Multer для нескольких изображений

exports.upload = multer(multerOptions).array('photo',[5]);

exports.resize = async (req, res, next) => {
    // check if there is no new file to resize
    if (!req.files) {
        next(); // skip to the next middleware
        return;
    } 
    imageArray = req.files;
    const extensions = [];
    for (var i = 0; i < imageArray.length; i++) {
        imageArray[i].mimetype.split('/')[1].push(extensions);
    }
    // I HAVEN'T MADE IT PAST THIS LINE YET AND AM STILL STUCK ABOVE
    req.body.photo = `${uuid.v4()}.${extension}`;
    // resize the image
    const photo = await jimp.read(req.files.buffer);
    await photo.resize(800, jimp.AUTO);
    await photo.write(`./public/uploads/${req.body.photo}`);
    next();
};

1 Ответ

0 голосов
/ 23 сентября 2018

Трудно точно понять, что не так, но, используя async await, разве вы не можете просто обернуть свой единственный рабочий пример в цикл for?Например:

imageArray = req.files;
for (var i = 0; i < imageArray.length; i++) {
  const file = imageArray[i]
  const extension = file.mimetype.split('/')[1]
  const name = `${uuid.v4()}.${extension}`
  // resize the image
  const photo = await jimp.read(file.buffer)
  await photo.resize(800, jimp.AUTO)
  await photo.write(`./public/uploads/${name}`)
}
next()

Это буквально в точности то, что вы имеете в своем работающем одиночном примере, но заключено в цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...