Как правильно скачивать бинарный docx на js?

ответ с сервера

Приветствую! Подскажите пожалуйста, сталкивался ли кто-то со скачиванием сгенерированного на сервере docx файла в бинарном виде (см. скрин). Вот способы которыми я пытался это провернуть. С библиотекой "file-saver" и без.

// Способ 1

    const blob = new Blob([response.data], {
      type: response.headers['content-type']
    })

    const a = document.createElement('a')
    const url = window.URL.createObjectURL(blob)
    a.href = url
    a.download = `${type}_${new Date().toISOString()}.docx`
    document.body.appendChild(a)
    a.click()

    document.body.removeChild(a)
    window.URL.revokeObjectURL(url)

// Способ 2

    const blob = new Blob([response.data], {
      type: response.headers['content-type']
    })
    const fileName = `${type}_${new Date().toISOString()}.docx`

    saveAs(blob, fileName)

В обоих случаях файл скачивается, но в word он пустой, а через гугл документы не открывается. Если этот файл открыть блокнотом, там бинарное содержимое первого скрина.

Но, при прогоне этого запроса в talend появляется ссылка, по которой всё скачивается и открывается как надо.

Буде признателен за наводку.


Ответы (1 шт):

Автор решения: DiD

Вы почти делали все правильно.

async function getFile(url){
  const request = new Request(url);
  const response = await fetch(request);
  const blob = await response.blob();
  const objectURL = URL.createObjectURL(blob);
  const a = document.createElement('a')
  a.setAttribute('href', objectURL);
  a.setAttribute('download',`${type}_${new Date().toISOString()}.docx`);
  document.body.appendChild(a);
  a.click()
  document.body.removeChild(a)
  URL.revokeObjectURL(objectURL);
}

А вообще, на будущее, docx - это-zip архив, в котором лежит document.xml и плюс в отдельных файлах все вложения.

→ Ссылка