Как отправить файл как двоичный файл данных формы с помощью node-fetch? - PullRequest
0 голосов
/ 05 мая 2020

Введение:

С 11 февраля 2020 года request полностью устарела. Никаких новых изменений не ожидается. Фактически, ни один из них не приземлялся какое-то время. Этот пакет также не рекомендуется, поскольку он зависит от запроса. - https://github.com/request/request-promise

Я использовал npm request-promise для отправки файлов из серверной части узла в restify конечные точки. К сожалению, request-promise устарел, поэтому я переключаюсь на node-fetch.

с обещанием запроса мне удалось создать запрос примерно так:

const formData = {
  file: {
    value: file,
    options: {
      filename: 'someFileName.xlsx',
      contentType: 'image/jpg'
    }
  }
}
const requestOptions = { ...., formData };
return requestPromiseFetch(url, requestOptions).then(response => { ....});

И получить файл из запроса в разделе "files" req.files.file.path

Это также работает при получении файлов из выборки браузера, что в chrome сетевом запросе выглядит так:

enter image description here

"postData": {
    "mimeType": "multipart/form-data; boundary=----WebKitFormBoundaryE6T9nfRvBAScnlki",
    "text": "------WebKitFormBoundaryE6T9nfRvBAScnlki\r\nContent-Disposition: form-data; name=\"file\"; filename=\"importTest.xlsx\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n\r\n\r\n------WebKitFormBoundaryE6T9nfRvBAScnlki--\r\n",
    "params": [
      {
        "name": "file",
        "value": "(binary)"
      }
    ]
  }

На бэкэнде я красиво получаю файл из запроса браузера следующим образом:

async function receivingFile (req) {
  console.log(req.files);
  const result = await schema.importer.importingFile({ fullPath: req.files.file.path });
  return { result };
}

выводит console.log:

{
  file: File {
    _events: [Object: null prototype] {},
    _eventsCount: 0,
    _maxListeners: undefined,
    size: 4803,
    path: '/var/folders/jv/py0twd4d2dgfslwry_ch8_tm0000gp/T/upload_3ba513d3d1ee5912c1d20067c3775c47.xlsx',
    name: 'importTest.xlsx',
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    hash: null,
    lastModifiedDate: 2020-05-05T11:18:24.421Z,
    _writeStream: WriteStream {
      _writableState: [WritableState],
      writable: false,
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      path: '/var/folders/jv/py0twd4d2dgfslwry_ch8_tm0000gp/T/upload_3ba513d3d1ee5912c1d20067c3775c47.xlsx',
      fd: null,
      flags: 'w',
      mode: 438,
      start: undefined,
      autoClose: true,
      pos: undefined,
      bytesWritten: 4803,
      closed: true
    }
  }
}

Я не хотел, чтобы полученный запрос от node-fetch выглядел так же, чтобы я мог получить файл точно так же, как я получаю его, когда он отправляется с помощью выборки браузера, и как раньше, когда отправлялся request-promise

Я прочитал этот вопрос: Как отправить файл в запросе node-fetch или Node? Но ни один из ответов не помог мне получить тот же результат, что и при использовании request-promise для создания http-запроса.

...