如何通过angular.js下载HTTP:POST请求返回的二进制文件?

时间:2015-11-02 17:23:05

标签: javascript jquery angularjs

我正在为我构建的服务器开发一个基于Angular.js的查看器,尝试添加“执行和下载”按钮。

我发送执行请求的方式是通过HTTP:POST请求,标题为:

"Accept" = "application/zip"
"X-MyApp-URI = "path/to/my/file/that/the/server/can/access/to"

服务器对此类请求的响应基本上是:

X-Powered-By: Servlet/3.0
Content-Type: application/zip
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Content-Disposition, Accept, Authorization, X-.....
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Origin: *
Content-Disposition: inline; filename="result.zip"
Transfer-Encoding: chunked
Date: Mon, 02 Nov 2015 15:29:42 GMT

我已经尝试过使用RESTClient 3.4&邮递员应用程序,在这两种情况下,下载的结果文件都是我发送的正确的zip。

以下是我尝试通过我的网络应用程序执行的代码:

var config = {'Accept':'application/zip', 'X-MyApp-URI' = 'path..'};
$http.post("../serverPath",{responseType: "bufferArray"}, config)
    .success(function (response) {
        var bytes = new Array(response.length);
        for (var i = 0; i < response.length; i++) {
            bytes[i] = response.charCodeAt(i)
        }
        var bytesUint = new Uint8Array(bytes);
        var blob = new Blob(bytesUint, {type: 'application/zip'});
        var blobUrl = URL.createObjectURL(blob);
        var a = document.createElement("a");
        document.body.appendChild(a);
        a.href = blobUrl;
        a.download = 'result.zip';
        a.click();
});

不幸的是,我已经尝试了几乎我能在网上找到的所有参数组合,没有任何帮助,通过上面的blob下载的文件总是被破坏。

我可以使用的解决方案是围绕纯JS代码,jQuery或特别是Angular.JS&amp;任何Apache已经开发的插件可能有助于解决这个问题。

1 个答案:

答案 0 :(得分:0)

尝试将Uint8Array直接传递给Blob,如下所示:

var config = {'Accept':'application/zip', 'X-MyApp-URI' = 'path..'};
$http.post("../serverPath",{responseType: "bufferArray"}, config)
    .success(function (response) {
        var bytesUint = new Uint8Array(response);
        var blob = new Blob([bytesUint], {type: 'application/zip'});
        var blobUrl = URL.createObjectURL(blob);
        var a = document.createElement("a");
        document.body.appendChild(a);
        a.href = blobUrl;
        a.download = 'result.zip';
        a.click();
});