Как получить текстовое значение из multipart / form-data - PullRequest
0 голосов
/ 01 мая 2020

Я создаю приложение 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. Попытка добавить заголовки в запрос на выборку также привела к различным ошибкам.

...