У меня есть форма на клиенте, которая позволяет пользователю добавлять несколько изображений в список, и каждое изображение имеет текстовый ввод для подписи.
Когда пользователь отправляет форму, я пытаюсь принять массив файлов и подписи одним экспресс-маршрутом. Я заполняю FormData
на клиенте и отправляю POST-запрос на сервер.
const data = new FormData();
//imageFiles is an array populated with multipart/form files
imageFiles.forEach(imageFile => data.append('uploads', imageFile));
//append the caption data
imageFileCaptions.forEach(caption => data.append('captions[]', caption));
Я отправляю данные формы на сервер с помощью axios.
axios.post(`/api/item/update`, data)
Вот экспресс-маршрут:
router.post('/update', upload.array('uploads'), processAttachments, async (req, res) => {
const item = req.body;
const result = await service.update(item, req.attachments, req.user);
...
});
Для загрузки промежуточного программного обеспечения я использую multer и multer-s3. Все это работает нормально, я получаю массив req.files
с загруженными файлами в следующей функции промежуточного программного обеспечения.
const upload = multer({
storage: multerS3({
s3,
bucket: process.env.STORAGE_BUCKET,
key: (req, file, cb) => {
cb(null, Date.now().toString())
}
})
});
Проблема в том, что я не могу получить корректный вывод массива captions
. req.body
выглядит так:
{"captions[]":"myvalue"}
Я пытался добавить body-parser
промежуточное ПО до processAttachments
, но это тоже не сработало.
Кажется, что Multer обрабатывает массив файлов без проблем, но как я могу заставить сервер анализировать FormData для заголовков?