在我的MVC項目中,我有一個AJAX調用Web API。從Web API返回時損壞的Zip?
我發送一個文件的路由數組,API(應該)將它們壓縮並返回zip文件。
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);
}
});
}
而且我ZipDocs上的WebAPI(使用DotNetZip庫)功能:
[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 };
}
但是,當返回郵編我得到了以下錯誤:
Uncaught Error: Corrupted zip: missing 16053 bytes.
什麼是真的奇怪的是,當我保存在API上的zip文件到磁盤它得到妥善保存,我可以打開文件沒有任何問題!
我在做什麼錯?我錯過了什麼嗎? 請幫忙!
在此先感謝。
我想知道如果''使用''''zipFile'語句導致您的對象被丟棄之前,數據實際上被保存到流的一路。嘗試刪除使用語句,看看它是否工作。直到對象返回後,您的保存代碼纔會運行。 – TyCobb
您是否必須在該點關閉流?在你通過電報發送完畢之前,你是否恰好關閉它? –