В NodeJS, как правильно создать функцию загрузки файлов docx через конечную точку REST?

#node.js #axios #nuxt.js #fs

Вопрос:

Я пытался создать функцию, которая позволяет клиенту загружать файл docx с сервера NodeJS.
Проведя некоторые исследования, я смог успешно загрузить файл, но не смог его открыть.
Ниже приведена моя попытка:

  • На сервере у меня есть конечная точка post:
 router.post("/download", async (req, res, next) => {
  // declare: _filepath, _filename
  ...
  let stream = fs.createReadStream(_filepath, { bufferSize: 64 * 1024 })
  res.setHeader('Content-Disposition', `attachment; filename=${_filename}`);
  res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessing');
  stream.pipe(res)
  ...
  // handle stream events: error, close
})
 
  • У клиента у меня есть:
 // declare _reqBody
...
await axios.$post("/download", _reqBody, { responseType: 'blob' })
  .then(response => {
    let blob = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.wordprocessing' });
    let url = window.URL.createObjectURL(blob);
    let a = document.createElement('a');
    a.href = url;
    a.download = 'myfile.docx';
    document.body.appendChild(a);
    a.click();
  });
 

Поскольку этот код делает меня доступным для загрузки, но файл, похоже, поврежден, не мог бы кто-нибудь помочь мне в этом?
Судя по моему гуглу, ответ должен выглядеть так
ожидаемый
но то, что я на самом деле получаю, было
фактический

Комментарии:

1. Установите значение Content-Type «приложение/октет-поток» и удалите bufferSize из fs.createReadStream . Попробуйте загрузить файл через postman или обычный http-запрос (браузер) с сервера узла, а затем попробуйте открыть его. Если это работает, просто сделайте запрос на стороне клиента URL-адреса файла. Кстати: Загрузка должна быть GET , а не публикация…

2. Большое вам спасибо за ответ @Marc. Я бы отправил значительную нагрузку на тело запроса, поэтому я использую POST .