загружать файлы из разных полей в форме, используя multer - PullRequest
0 голосов
/ 04 июня 2018

У меня есть документ, который содержит два поля ввода type="file", и я хочу загрузить оба из них при отправке.

Этот метод публикации дает мне internal server error 500 при загрузке двух файлов, но когда я загружаюодин файл, все в порядке.

router.post('/', mediaFiles.uploadSingle('icon_url'), mediaFiles.uploadSingle('background_url'),
    async (req, res) => {
       name: req.body.name,
       icon_url: req.file.path.replace(/\\/g, "/"), // req.file['icon_url']
       background_url: req.file.path.replace(/\\/g, "/") // req.file['background_url']
})

Вы можете игнорировать этот класс MediaFiles, поскольку он предоставляет традиционный код для загрузки изображений с помощью multer

import multer from "multer";
import path from "path";

class MediaFiles {
    private storage = multer.diskStorage({
        destination: 'uploads/',
        filename: function (req, file, callback) {
            callback(
                null,
                file.originalname.replace(/\.[^/.]+$/, "") + '-' + Date.now() + path.extname(file.originalname))
        }
    })

    uploadSingle(fieldName?: string) {
        try {
            return multer({
                storage: this.storage,
                limits: { fileSize: 1024 * 1024 * 1 }, // 1MB = 1024 * 1024 * 1
                fileFilter: function (req, file, callback) {
                    const fileTypes = /jpeg|jpg|png/;

                    const extName = fileTypes.test(path.extname(file.originalname).toLowerCase());
                    const mimeType = fileTypes.test(file.mimetype);

                    if (extName && mimeType) {
                        callback(null, true)
                    } else {
                        callback(new Error('Error: Images Only!'), null)
                    }
                }
            }).single(fieldName);
        } catch (err) {
            console.log(err.message)
        }
    }
}

export default new MediaFiles();

1 Ответ

0 голосов
/ 13 августа 2019

Я не думаю, что вы могли бы иметь два более сложных объекта, у меня была одна и та же проблема, и вот что сработало для меня.

const storage = multer.diskStorage()
const mediaFiles = multer({ 
storage:storage })
.fields([{ name: 'icon_url', maxCount: 1 }, { name: 'background_url', maxCount: 1 } ]

router.post('/', mediaFiles, async (req, res) => {
    console.log(req.files) // req.files is an array of files
}
...