In meinem MVC-Projekt habe ich einen AJAX-Aufruf an eine Web-API.Beschädigter Zip beim Zurückkehren von der Web-API?
Ich sende eine Reihe von Dokumenten Routen, die API (sollte) reißt sie und gibt die Zip-Datei zurück.
self.zipDocs = function (docs, callback) {
$.ajax({
url: "../SharedAPI/documents/zip",
type: "POST",
data: docs,
contentType: "application/json",
success: function (data) {
var zip = new JSZip(data);
var content = zip.generate({ type: "blob" });
saveAs(content, "example.zip");
},
error: function (data) {
callback(data);
}
});
}
und Funktion meine ZipDocs auf dem WebAPI (die DotNetZip-Bibliothek):
[HttpPost]
[Route("documents/zip")]
public HttpResponseMessage ZipDocs([FromBody] string[] docs)
{
using (var zipFile = new ZipFile())
{
zipFile.AddFiles(docs, false, "");
return ZipContentResult(zipFile);
}
}
protected HttpResponseMessage ZipContentResult(ZipFile zipFile)
{
// inspired from http://stackoverflow.com/a/16171977/92756
var pushStreamContent = new PushStreamContent((stream, content, context) =>
{
zipFile.Save(stream);
stream.Close(); // After save we close the stream to signal that we are done writing.
}, "application/zip");
return new HttpResponseMessage(HttpStatusCode.OK) { Content = pushStreamContent };
}
Aber wenn das Zip zurückgegeben ich folgende Fehlermeldung bekommen:
Uncaught Error: Corrupted zip: missing 16053 bytes.
Was ist wirklich komisch, wenn ich auf der API die Zip-Datei auf der Festplatte speichern wird es richtig gespeichert und ich kann die Datei ohne Probleme öffnen!
Was mache ich falsch? Fehle ich etwas? Bitte helfen!
Vielen Dank im Voraus.
Ich frage mich, ob Ihre 'using' Anweisung für die' zipFile' verursacht Ihr Objekt entsorgt werden, bevor die Daten tatsächlich in den Stream vollständig gespeichert werden. Versuchen Sie, die using-Anweisung zu entfernen und zu überprüfen, ob sie funktioniert. Ihr Sicherungscode wird erst nach der Rückgabe des Objekts ausgeführt. – TyCobb
Müssen Sie den Stream an diesem Punkt schließen? Schliessen Sie es nicht, bevor alles über die Leitung gesendet wurde? –