2015-01-14 6 views
11

В моем решении Ext Js Я вызываю службу, возвращающегося этот формат JSONфайла загрузить массив байтов в виде файла в JavaScript/ExtJS

{"success":true,"filename":"spreadsheet.xlsx","file":[80,75,3,4,20,0,...(many more)]} 

Как я могу сделать диалог загрузки файла с именем файла и содержимое массива байтов (файл)?

UPDATE

Так что я нашел этот бит, чтобы начать 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) 

До сих пор хорошо

Но файл я испорченный, так что я подозреваю, что нужно закодировать/Decode файл переменная?

+0

Посмотрите: http://stackoverflow.com/questions/1801076/renaming-files-when-downloading-it/16993368#16993368 –

ответ

22

Я должен был преобразовать файл в 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) 

Читая этот ответ помог многим https://stackoverflow.com/a/16245768/1016439

+0

я провел совсем немного время на это с неправильной кодировкой. Спасибо за решение. Я использовал Uint16Array – Reddy

0

Опираясь на ответ Jepzen, я был в состоянии использовать эту технику, загрузить документ из 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); 
 
     } 
 
}); 
 

Смежные вопросы