#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
.