2016-01-27 19 views
11

Voglio scaricare il file che sta arrivando in forma di byte dalla risposta AJAX.Scarica file da byte in JavaScript

ho cercato di fare in questo modo, con l'aiuto di 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(); 

E 'infatti il ​​download in pdf, ma il file stesso è danneggiato.

Come posso realizzare questo?

+0

Questo è un po 'di un commento +1. Sto cercando di fare la stessa cosa, e con gli stessi risultati, un PDF corrotto. Il PDF si aprirà, ha lo stesso numero di pagine che mi aspetto, ma non c'è testo. Sospetto che il problema risieda nella codifica del PDF o nella conversione da "[resultByes]" in un blob ... Mi piacerebbe sapere se hai trovato una soluzione. –

+0

@runlevelsix, sì l'ho capito! Si prega di vedere la mia risposta qui sotto e vedere se funziona anche per te –

risposta

29

ho fatto la domanda di età molto tempo, così mi potrebbe essere sbagliato in alcuni dettagli.

Blob come risultato necessita di buffer di array. Ecco perché i byte base64 devono essere prima convertiti in buffer di array.

Qui è la funzione per farlo:

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; 
} 

Qui è la mia funzione per salvare un file pdf:

function saveByteArray(reportName, byte) { 
    var blob = new Blob([byte]); 
    var link = document.createElement('a'); 
    link.href = window.URL.createObjectURL(blob); 
    var fileName = reportName + ".pdf"; 
    link.download = fileName; 
    link.click(); 
}; 

Ecco come utilizzare queste due funzioni insieme:

var sampleArr = base64ToArrayBuffer(data); 
saveByteArray("Sample Report", sampleArr); 
+2

Prima di tutto, grazie, questo è fantastico e ho cercato dappertutto. Secondo, quali sono le variabili timeNow e month per? –

+1

@ Grez.Kev nella versione originale, il' fileName 'consisteva anche di' timeNow' e 'month'. Ho cancellato quel codice ma ho dimenticato di questi due.Grazie per l'avviso, sono ridondanti, credo. –

+0

Grazie per aver postato questa soluzione! Ho trovato la mia richiesta troppo grande per essere visualizzata 'errore durante il tentativo di aprire window.location (byte [] come pdf) – alsco77

0

Set Blobtype a Blob costruttore invece che a 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(); 
+0

Questo è quello che ho effettivamente fatto. Lo ho trascritto qui. Grazie –

+0

'js' restituisce i risultati previsti? Può descrivere il file stesso è danneggiato "? – guest271314

0

Hai solo bisogno di aggiungere una linea in più e dovrebbe funzionare. La tua risposta è array di byte dall'applicazione server

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();