将zip文件返回到angularjs以供下载

Nic*_*ros 0 javascript zip zipfile angularjs asp.net-web-api2

我有以下angularjs代码:

$scope.search = function() {
    creatorService.search($scope.model).then(function(data) {
        saveAs(new Blob([data], { type: "application/octet-stream'" }), 'testfile.zip');
    });
};
Run Code Online (Sandbox Code Playgroud)

(也使用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;
    }
Run Code Online (Sandbox Code Playgroud)

我从这篇文章中得到了很多这个,它使用了ZipFile.

一切似乎都很完美,除了当我下载zip文件时,我无法打开它 - 它无效.它具有合适的大小,并且似乎具有正确的内容,但我无法打开它.

我可以验证angularjs代码是否Post()正确命中,正在传递参数(如果我有它们)并且Post()正在执行并返回而没有错误.然后fileSaver的东西正确处理返回内容,我可以保存生成的zip文件.

我不是以正确的方式做这件事,还是我做错了什么?

Dav*_*hel 5

我正在重新发表评论(因为这是解决方案):

如果您直接致电(不使用任何javascript代码)您的服务,您是否获得有效的zip文件?我怀疑ajax调用会破坏你的文件.你的js代码中的数据类型是什么?

如果这是一个字符串,您的浏览器可能正在应用utf8转换(破坏您的文件).在这种情况下,您可以在执行ajax请求时请求ArrayBufferxhr.responseType = "arraybuffer";