Файл загружает байтовый массив как файл в javascript/Extjs
В моем решении Ext Js я вызываю службу, которая возвращает этот формат JSON
{"success":true,"filename":"spreadsheet.xlsx","file":[80,75,3,4,20,0,...(many more)]}
Как я могу создать диалог загрузки файла с именем файла и содержимым массива байтов (файл)?
ОБНОВЛЕНИЕ
Итак, я нашел этот бит для запуска downlaod
var a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob(data.file, { type: 'application/octet-stream' }));
a.download = data.filename;
// Append anchor to body.
document.body.appendChild(a)
a.click();
// Remove anchor from body
document.body.removeChild(a)
Пока хороший
Но файл, который я получаю, поврежден, поэтому я подозреваю, что мне нужно кодировать/декодировать переменную файла?
Ответы
Ответ 1
Мне пришлось преобразовать файл в Uint8Array, прежде чем передать его в Blob
var arr = data.file;
var byteArray = new Uint8Array(arr);
var a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/octet-stream' }));
a.download = data.filename;
// Append anchor to body.
document.body.appendChild(a)
a.click();
// Remove anchor from body
document.body.removeChild(a)
Чтение этого ответа помогло значительно fooobar.com/questions/24226/...
Ответ 2
Основываясь на ответе Джепцена, я смог использовать этот метод для загрузки документа из AWS S3 из браузера. +1 Jepzen
s3.getObject(params, function(err, data) {
if (err === null) {
var arr = data.Body;
var byteArray = new Uint8Array(arr);
var a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/octet-stream' }));
a.download = fName; //fName was the file name portion of the key what was passed in as part of the key value within params.
// Append anchor to body.
document.body.appendChild(a)
a.click();
// Remove anchor from body
document.body.removeChild(a)
} else {
result = 'failure'
console.log("Failed to retrieve an object: " + err);
}
});