我有以下angularjs代码:
$scope.search = function() {
creatorService.search($scope.model).then(function(data) {
saveAs(new Blob([data], { type: "application/octet-stream'" }), 'testfile.zip');
});
};
(也使用fileSaver.js)
然后在我的webapi2方面采用以下方法:
public HttpResponseMessage Post(Object parameters)
{
var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
{
try
{
using (var zip = new ZipFile())
{
zip.AddEntry("test.txt", "test data");
zip.Save(outputStream);
}
}
finally
{
outputStream.Close();
}
});
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "test.zip"
};
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = streamContent
};
return response;
}
我从this post得到了很多这个,它使用了ZipFile。
一切似乎都很完美,除了我下载zip文件时,我无法打开它 - 它无效。它的大小合适,似乎有正确的内容,但我无法打开它。
我可以验证angularjs代码是否正确地命中Post()
,正在传递参数(如果我有它们)并且Post()
正在执行并且没有错误地返回。返回内容然后由fileSaver的东西正确处理,我可以保存生成的zip文件。
我不是以正确的方式做这件事,还是我做错了什么?
答案 0 :(得分:5)
我正在重新发表评论(因为这是解决方案):
如果您直接致电(不使用任何javascript代码)您的服务,您是否获得了有效的zip文件? 我怀疑ajax调用会破坏你的文件。你的js代码中的数据类型是什么?
如果这是一个字符串,您的浏览器可能正在应用utf8转换(破坏您的文件)。在这种情况下,您可以在执行ajax请求时请求ArrayBuffer xhr.responseType = "arraybuffer";