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

时间:2014-06-06 20:46:44

标签: javascript angularjs zip asp.net-web-api2 zipfile

我有以下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文件。

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

1 个答案:

答案 0 :(得分:5)

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

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

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