Я создаю приложение React, и один из компонентов создает объект FormData с двумя полями - одно - файл, а другое - строка. FormData отправляется как метод PUT на маршрут express, и его тип - multipart / form-data, потому что есть файл для загрузки. Там мне нужно получить строку val ie из формы (называемой path), затем использовать multer / multer-s3 для загрузки файла в AWS S3 по указанному пути.
Я застрял на том, как это сделать. Я не смог найти ответ о том, как извлечь текстовое поле из составного запроса. Я видел Как опубликовать форму "multipart / form-data" и получить значения текстового поля с сервера Node.js? и несколько аналогичных предложений, однако предложенный ответ мне не помог.
На веб-сайте body-parser'а написано: «Это не обрабатывает многочастные тела», так что это также означает, что bodyParser.urlencoded не поможет в моем случае.
Реагирующий компонент:
const path = `/somepathhere/`;
const formData = new FormData();
formData.append('file', file);
formData.append('path', path)
// call API handler
apiActions. js:
const response = await fetch(apiUrl, {
method: "PUT",
body: formData
})
server. js:
// other code taken out for brevity
// middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// other code taken out for brevity
app.put('/api/uploadToS3', (req, res) => {
const path = '';
const storage = multerS3({
s3: s3,
bucket: process.env.AWS_S3_BUCKET,
contentType: multerS3.AUTO_CONTENT_TYPE,
cacheControl: 'max-age=31536000',
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, path + file.originalname)
}
})
const upload = multer({
storage: storage
}).any();
upload(req,res,function(err) {
if(err) {
console.log(err);
return res.end("Error uploading file.");
} else {
res.end("File has been uploaded");
}
});
});
Если есть лучший способ справиться с этим, я бы также хотел знать. Конечная цель заключается в том, чтобы файл был загружен по пути S3, динамически определенному в приложении React. Я попытался отправить объект с formData и path, например, так:
const response = await fetch(apiUrl, {
method: "PUT",
body: {formData: formData, path: path}
})
Но это дало ошибку: [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
. Попытка добавить заголовки в запрос на выборку также привела к различным ошибкам.