WebAPI und angular JS Excel-Datei download - Datei ist beschädigt
Ich bin die Generierung einer Excel-Datei in meine WebAPI. Ich "speichern" in einen memorystream und dann die Reaktion wie folgt :
var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(ms) };
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = projectName + ".xlsx"
};
//ms.Close();
return result;
Sieht es aus wie die server-Seite arbeiten korrekt. Wenn ich Schreibe, dass memorystream in den filestream, die Datei ist erstellt und kann ohne Probleme öffnen.
Auf der eckigen Seite, wie kann ich die Datei neu anlegen, wenn Sie auf eine Schaltfläche klicken?
Habe ich versucht, etwas wie dieses :
$scope.exportQuotas = function (projectName) {
homeService.GetQuotas(projectName, $routeParams.token, $scope.selection).then(
function (data) {
var dataUrl = 'data:application/octet-stream;' + data
var link = document.createElement('a');
angular.element(link)
.attr('href', dataUrl)
.attr('download', "bl.xlsx")
.attr('target', '_blank')
link.click();
})
}
Wird die Datei erstellt, aber wenn ich versuchte, es zu öffnen, es ist beschädigt... ich habe versucht, die änderung der Daten-Typ vnd.ms-excel-im Winkel-aber es hat nicht funktioniert...
Wie kann ich die Datei heruntergeladen werden, die auf klicken Sie auf?
BEARBEITEN
Nach Jorg Antwort, ich habe versucht, die folgenden :
Was die api gibt ist :
Status Code: 200
Pragma: no-cache
Date: Tue, 02 Sep 2014 02:00:24 GMT
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Type: application/binary
Access-Control-Allow-Origin: *
Cache-Control: no-cache
X-SourceFiles: =?UTF-8?B? QzpcVXNlcnNcdHJpaGFuaC5waGFtXFByb2plY3RzXFF1b3RhUXVlcnlcUXVvdGFRdWVyeUFQSVxhcGlccXVvdGFcR2V0?=
Content-Disposition: attachment; filename=O14Y0129AUG.xlsx
Content-Length: 13347
Expires: -1
Aus, was ich sehen kann, sieht es richtig.
Client-seitig :
var file = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
Einer excel-Datei wird erstellt aber es ist immer noch beschädigt...
Dank
- Ich habe mir funktioniert dies so: stackoverflow.com/questions/22447952/...
- Es hat nicht funktioniert für mich aber nicht 🙁 die Datei beschädigt ist... auch als metionned, das mit dem Namen ist komisch...
- ist
data
base64?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem. Die Datei war OK server-Seite, aber wenn es heruntergeladen wurde beschädigt.
Was gelöst, es war für mich hinzufügen
responseType: "arraybuffer"
auf der server-Anfrage.Dann beim Aufruf dieser Zeile
var file = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
Die
data
variable sollte vom TypArrayBuffer
, und nicht einen string.$http.get(url, { responseType: "arraybuffer" })
Das Hauptproblem kommt von der Tatsache, dass in der Standardeinstellung XMLHttpRequest verwendet die Standard-Antwort geben, das ist eine leere Zeichenfolge. Sehen Sie diese link. Ihre binäre Daten sind daher nicht richtig behandelt.
Wenn Sie mit javascript-API, die Sie brauchen zu kümmern, die Antwort Datentyp für binäre Daten. Ansonsten wird es als String interpretiert.
API wie angular-Datei-upload (Letzte version ist aktuell 1.1.5) zum Beispiel nicht die Möglichkeit zum einstellen der Antwort der Art des empfangenen Daten werden nach einem upload. Ich hatte ein update der API zu definieren, die Antwort geben.