2015-10-10 5 views
5

Ich versuche, eine Datei mit FileSaver.js herunterzuladen, aber ich bekomme eine beschädigte Datei, wenn ich Download-Taste drücke.Beschädigter Download in AngularJs App

Die App wird von einem PHP REST Service unterstützt und die Verwendung von cURL von der Befehlszeile bestätigt, dass REST funktioniert.

ist hier die letzte Version von Pseudo-Code, den ich für das Herunterladen verwenden:

// Let str be the data received from $http promise 
// This code is run in a "then" callback 

var arr= new Uint8Array(str.length); 
for(var i=0; i<str.length; i++) { 
    arr[b]=str.charCodeAt(i); 
}; 
var blob = new Blob([arr], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

Es Datei nur korrumpiert.

Ich habe auch versucht, ohne die Uint8Array, und geben str direkt an Blob. Wie du vermutet hast, ist es auch gescheitert.

Ich schreibe Server und Client selbst, damit ich alles ändern kann. Aber die Sache ist, ich möchte Downloads clientseitig behandeln, und ich kann einfach nicht Benutzer zu Datei URL umleiten, um es herunterzuladen, weil REST Authentifizierung benötigt und dieses Token lebt nur in Angular App. Es wäre keine gute Wahl, den Server zu wechseln, nur um Dateidownloads ohne Authentifizierung zu handhaben.

Die REST hat URLs wie /files/:id, die, wenn sie aufgerufen werden, Dateiinhalt als regulären HTTP-Dateidownload (getestet mit cURL wie oben) gibt. Könnte $http das Problem sein? Irgendwie erzwingen sie irgendeine Art von Kodierung oder einige Annahmen über die empfangenen Daten. Ich habe ohnehin wenig Erfahrung in Angular.

+0

@ArtjomB Sag "Danke" gegen Regeln hier? – vfsoraki

+0

Du könntest das sagen: [Sollen 'Hallo', 'Danke', 'Taglines' und 'Grüße' von Beiträgen entfernt werden?] (Http://meta.stackexchange.com/q/2950/266187), aber geh nicht und entferne diese Dinge aus dem alten Post. Das könnte ihnen unerwünschte Aufmerksamkeit schenken. Auch wenn Sie dies tun, sollten Sie alles in der Post beheben. Der Grund, warum ich diese Änderung gemacht habe, war, dass ein anderer Benutzer das PHP-Tag für Ihre Frage vorgeschlagen hat, was falsch schien, da Sie gesagt haben, dass Sie dieses Teil getestet haben und es funktioniert. Ich habe dann ihre Bearbeitung mit einer eigenen Bearbeitung abgelehnt. –

Antwort

5

Ich habe das Problem gefunden. Es war ich :)

Ich musste responseType: "arraybuffer" für $http angeben dann geben Sie str direkt an Blob.

Fest Code

// Let str be the data received from $http promise 
// This code is run in a "then" callback 
// Make sure to specify "responseType: "arraybuffer"" for $http 

var blob = new Blob([str], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

Ich ändere responseType in falscher Stelle.

+0

Können Sie angeben, wo genau Sie responseType hinzugefügt haben. Ich füge es wie dieses queryObject = $ resource (Pfad, {}, { get: { Methode: 'GET', response: 'Arraybuffer' } } }); – Achyut

+0

@Achyut Ich habe '$ resource' nicht verwendet, ich habe' $ http' selbst verwendet. Sie können herausfinden, wie man "$ http" -Parameter zu "$ resource" gibt, denke ich. – vfsoraki

+0

Großartig, danke. Ich war verrückt, herauszufinden, warum meine Downloads alle beschädigt waren. – javatutorial