Загрузить файл с байтов в JavaScript
Я хочу загрузить файл, который поступает в виде байтов из ответа AJAX.
Я попытался сделать это с помощью Bolb
:
var blob=new Blob([resultByte], {type: "application/pdf"});
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Фактически загружается файл pdf, но сам файл поврежден.
Как я могу это сделать?
Ответы
Ответ 1
Я задал вопрос давным-давно, поэтому я могу ошибаться в некоторых деталях.
Оказывается, что Blob
нужны буферы массивов. Поэтому байты base64 необходимо сначала преобразовать в буферы массива.
Вот функция для этого:
function base64ToArrayBuffer(base64) {
var binaryString = window.atob(base64);
var binaryLen = binaryString.length;
var bytes = new Uint8Array(binaryLen);
for (var i = 0; i < binaryLen; i++) {
var ascii = binaryString.charCodeAt(i);
bytes[i] = ascii;
}
return bytes;
}
Вот моя функция для сохранения файла PDF:
function saveByteArray(reportName, byte) {
var blob = new Blob([byte], {type: "application/pdf"});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
var fileName = reportName;
link.download = fileName;
link.click();
};
Вот как можно использовать эти две функции вместе:
var sampleArr = base64ToArrayBuffer(data);
saveByteArray("Sample Report", sampleArr);
Ответ 2
Вам просто нужно добавить одну дополнительную строку, и она должна работать. Ваш ответ представляет собой массив байтов из вашего серверного приложения.
var bytes = new Uint8Array(resultByte); // pass your byte response to this constructor
var blob=new Blob([bytes], {type: "application/pdf"});// change resultByte to bytes
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Ответ 3
Задайте Blob
type
в конструкторе Blob
вместо createObjectURL
var blob = new Blob([resultByte], {type: "application/pdf"});
var link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = "myFileName.pdf";
link.click();