2016-01-27 17 views
11

Ich möchte die Datei, die in Form von Bytes aus AJAX-Antwort kommt.Datei von Bytes in JavaScript herunterladen

Ich habe versucht, es auf diese Weise mit Hilfe von Bolb zu tun:

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

Es ist in der Tat das Herunterladen der pdf-Datei, aber die Datei selbst ist beschädigt.

Wie kann ich das erreichen?

+0

Dies ist ein bisschen ein +1 Kommentar. Ich versuche das Gleiche zu tun, und mit den gleichen Ergebnissen - eine beschädigte PDF. Das PDF wird geöffnet, hat die gleiche Anzahl von Seiten, die ich erwarte, aber es gibt keinen Text. Ich vermute, das Problem liegt entweder in der Kodierung des PDFs oder in der Umwandlung von '[resultByes]' in einen Blob ... Ich würde gerne hören, ob Sie eine Lösung gefunden haben. –

+0

@runlevelsix, ja das habe ich herausgefunden! Bitte sehen Sie meine Antwort unten und sehen, ob es auch für Sie funktioniert –

Antwort

29

ich die Frage lange Alter gefragt, so könnte ich in einigen Details falsch sein.

Blob wie es sich herausstellte benötigt Array-Puffer. Aus diesem Grund müssen base64-Bytes zuerst in Array-Puffer umgewandelt werden. Hier

ist die Funktion, das zu tun:

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

Hier ist meine Funktion ist eine PDF-Datei zu speichern:

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

Hier ist, wie diese beiden Funktionen zusammen zu verwenden:

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

Zunächst einmal, danke, das ist fantastisch und ich sah überall. Zweitens, was ist die TimeNow und Monat Variablen für? –

+1

@ Grez.Kev in der ursprünglichen Version, die' fileName "bestand aus" timeNow "und" Monat "auch. Ich löschte diesen Code aber vergaß diese zwei. Danke für das Bemerken. Sie sind redundant, glaube ich. –

+0

Danke für das Posten dieser Lösung! Um meine 'Anfrage ist zu groß, um anzuzeigen 'Fehler beim Öffnen von window.location (byte [] als pdf) – alsco77

0

Set Blobtype bei Blob Konstruktor statt bei 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

Das ist, was ich tat. Ich habe es hier falsch geschrieben. Danke –

+0

Gibt 'js' die erwarteten Ergebnisse zurück? Kann beschreiben, die Datei selbst ist beschädigt "? – guest271314

0

Sie müssen nur eine zusätzliche Zeile hinzufügen, und es sollte funktionieren. Ihre Antwort ist Byte-Array von Ihrer Server-Anwendung

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