Почему мой сгенерированный docx в javascript из блоба заполняется [Object Object]?
Я отправляю данные на мой Django backend через POST запрос, сервер затем создает docx, используя эти данные, и отправляет его обратно мне, где я пытаюсь загрузить его, используя следующий код :
axios.post(route, data).then((res) => {
const filename = "report.docx"
var blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
var link = document.createElement('a');
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
link.href = downloadUrl;
link.style = "display: none";
link.download = filename;
document.body.appendChild(link)
link.click()
link.remove()
});
Загрузка файла работает, но когда я открываю его, он содержит только [Object Object], что я делаю не так? Я проверил бэкенд и документ создан правильно, так как он имеет правильное содержание, когда я сохраняю его, когда он генерируется на сервере, так что это либо то, что я отправляю его плохо, либо плохо создаю файл во фронтенде.
Вот как я отправляю его из бэкенда :
#Generating the doc properly before this...
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
report_filename = 'graph-report-'+now.strftime('%Y-%m-%d_%H-%M-%S')+'.docx'
response['Content-Disposition'] = 'attachment; filename=%s'%(report_filename)
document.save(response)
return response
Спасибо, что помогли мне.
В Axios, res
в axios.post(route, data).then((res) =>
является объектом ответа.
Возвращенные данные находятся в res.data
.
- Сделайте
console.log(res.data)
, чтобы убедиться, что это действительно двоичные данные, которые вы ожидаете. - Сделайте
new Blob([res.data], ...
, чтобы использовать эти данные для получения блоба. (Если это уже блоб, любезно предоставленный Axios, вам необязательно беспокоиться).
(В качестве примечания, на самом деле вам не нужно использовать fetch()
и createObjectURL
для этого, поскольку вы формируете бинарный ответ, похожий на загрузку; достаточно, чтобы браузер просто отправил нужные данные, например, в виде формы, в конечную точку; он точно так же загрузит ответ)