Я использую a-элемент в качестве кнопки загрузки для файлов, которые мне приходилось запрашивать ранее с помощью AJAX, как описано здесь , здесь и здесь .Я поместил файл-данные как Data-URI в a-элемент, чтобы создать кнопку загрузки.К сожалению, я не могу просто указать на файл, но должен сделать это так.С большинством форматов загрузки HTML, CSV это работает так:
var mimeType = "text/html"; // example. works also with others.
var BOM = '\ufeff';
var url = "data:"+ mimeType +";charset=UTF-8," + BOM + encodeURIComponent(response.data);
var linkElem = document.querySelector("#hiddenDownloadLink");
var link = angular.element(linkElem);
link.prop("href", url);
link.prop("download", 'myFile.' + extension);
linkElem.click();
Хорошо.Это работает.Но не для PDF.
Я создаю PDF в своем бэкэнде (java, с openhtmltopdf, но, думаю, это не имеет значения, поскольку PDF определенно правильный):
httpOutputMessage.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/pdf");
httpOutputMessage.getHeaders().add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"myFile.pdf\"");
makePdf(httpOutputMessage.getBody());
ЕслиЯ запрашиваю бэкэнд напрямую, или даже если я записываю вывод в файл, все в порядке.Но когда я использую свой контроллер загрузки, как описано выше, я получаю PDF с нужным количеством страниц, но полностью пустой! Я думаю, что должна быть проблема с кодировкой.Я пытался с и без спецификации, также с или без encodeURIComponent.
Я также пытался использовать base64-декодирование как.Поскольку window.atob (response.data) завершается неудачей из-за разрывов строк и других, я попытался это преобразование.Результат - сломанный PDF.Результаты в сломанных PDF-файлах.Я не уверен, имеет ли это какой-либо смысл.
Мои PDF-данные начинаются следующим образом, поэтому они не сжимаются и не кодируются так или иначе:
%PDF-1.4
%����
1 0 obj
<<
/Type /Catalog
/Version /1.7
/Pages 2 0 R
>>
endobj
3 0 obj
<<
Я также пытался преобразовать байтовый поток в BLOB-объектыи сгенерируйте ссылку, как описано здесь или здесь , но это создает испорченные PDF-файлы.
Любые идеи, почему я получаю пустые PDF-файлы или что здесь может пойти не так и какя могу восстановить ссылку для скачивания?
- Изменить 1
Я также получаю действительный, но пустой PDF при попытке
var blob = new Blob([response.data], {type: 'application/pdf'});
var url = window.URL.createObjectURL(blob);
link.prop("href", url);
Когда я отправляю response.dataчерез эту функцию я получаю сломанный PDF.
var utf8_to_b64 = function(str) {
var unescape = window.unescape || window.decodeURI;
str = encodeURIComponent(str);
str = unescape(str);
str = window.btoa(str);
return str;
};