【发布时间】:2016-05-12 18:19:25
【问题描述】:
在我的 MVC 项目中,我有一个对 Web API 的 AJAX 调用。
我发送一组文档的路由,API(应该)压缩它们并返回压缩文件。
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);
}
});
}
还有我在 WebAPI 上的 ZipDocs 函数(使用 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 };
}
但是当 Zip 被返回时,我得到了以下错误:
未捕获的错误:损坏的 zip:缺少 16053 个字节。
真正奇怪的是,当我在 API 上将 zip 文件保存到磁盘时它被正确保存,我可以毫无问题地打开文件!
我做错了什么?我错过了什么吗? 请帮忙!
提前致谢。
【问题讨论】:
-
我想知道您的
zipFile的using语句是否导致您的对象在数据实际保存到流中之前被释放。尝试删除 using 语句,看看它是否有效。在您的对象返回之前,您的保存代码不会运行。 -
此时是否必须关闭流?你不是碰巧在所有东西都通过电线发送之前关闭它吗?
标签: c# ajax zip dotnetzip jszip