React + Node Express, скачанный файл docx поврежден - PullRequest
0 голосов
/ 05 февраля 2020

Я прочитал много похожих вопросов, перепробовал много предложенных решений, но ни один не помог мне. Итак, я отправляю файл из бэкэнда, используя "res.download ('directory /' + filename)", и, судя по заголовкам ответа, я получаю правильный файл. В папке, из которой я отправляю, нет других файлов, исходный файл размером 14 КБ. Тем не менее, часть данных «ответ» составляет около 21 КБ. Вот что я делаю с ответом в веб-приложении, чтобы получить файл:

await axios.get(`api` + file.id, 
        {headers: {'x-access-token': token}}, { responseType: 'arraybuffer' }
    ).then((response) => {
        const url = window.URL.createObjectURL(new Blob([response.data])); //specifying the type here doesn't help
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', `${filename}`); //filename = the name of the file i'm trying to download
        document.body.appendChild(link);
        link.click();
        link.parentNode.removeChild(link);
    })

И полученный в результате файл также имеет размер около 21 КБ и не открывается словом из-за его повреждения.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вам может потребоваться добавить расширение файла в конце имени файла, например:

 link.setAttribute('download', `${filename}.docx`);
0 голосов
/ 05 февраля 2020

Немного повозившись с синтаксисом ax ios .get, добавьте "responseType" вместе с конфигом, в котором есть заголовки. И теперь файл, который я получаю, не поврежден o_o

axios.get(`api/` + file.id, 
  {
    headers: 
    {
      'x-access-token': token
    },
    responseType: 'arraybuffer' 
  }
)

Сначала я подумал, что размер файла был другим, но это не так. Так что это определенно исправлено LOL. Вот что я получаю, будучи нубом в js.

...