一尘不染

客户端下载服务器生成的zip文件

angularjs

鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。

我的angular 1.5.X客户端为我提供了标题列表,每个标题都有一个关联的文件。我的Node 4.X / Express
4.X服务器使用该列表,获取文件位置,使用npm中的express-zip创建一个zip文件,然后将该文件流式传输回响应中。然后,我希望我的客户端启动浏览器的“下载文件”选项。

这是我的客户代码(Angular 1.5.X):

function bulkdownload(titles){
    titles = titles || [];
    if ( titles.length > 0 ) {
        $http.get('/query/bulkdownload',{
            params:{titles:titles},
            responseType:'arraybuffer'
        })
        .then(successCb,errorCb)
        .catch(exceptionCb);
    }

    function successCb(response){
        // This is the part I believe I cannot get to work, my code snippet is below
    };

    function errorCb(error){
            alert('Error: ' + JSON.stringify(error));
    };

    function exceptionCb(ex){
            alert('Exception: ' + JSON.stringify(ex));
    };
};
带有 express-zip的 节点(4.X)代码,https

//www.npmjs.com/package/express-zip:

router.get(‘/bulkdownload’,function(req,resp){
var titles = req.query.titles || [];

if ( titles.length > 0 ){
    utils.getFileLocations(titles).
    then(function(files){
        let filename = 'zipfile.zip';

        // .zip sets Content-Type and Content-disposition
        resp.zip(files,filename,console.log);
    },
    _errorCb)
}

});

这是我的客户代码(Angular 1.5.X)中的successCb:

function successCb(response){
    var URL = $window.URL || $window.webkitURL || $window.mozURL || $window.msURL;
    if ( URL ) {
        var blob = new Blob([response.data],{type:'application/zip'});
        var url = URL.createObjectURL(blob);
        $window.open(url);
    }
};

“斑点”部分似乎工作正常。在IE的调试器中对其进行检查,它看起来确实像八位位组信息的文件流。现在,我相信我需要将该blob放入一些HTML5指令中,以便从浏览器启动“文件另存为”。也许?也许不会?

由于我们90%以上的用户都在使用IE11,因此我在PhantomJS(Karma)和IE中测试了我所有的角度。运行代码时,在警报窗口中收到旧的“访问被拒绝”错误:

Exception: {"description":"Access is denied...<stack trace>}

欢迎提出建议,澄清,答案等!


阅读 255

收藏
2020-07-04

共1个答案

一尘不染

我更新了我的bulkdownload方法,$window.open(...)而不是使用$http.get(...)

function bulkdownload(titles){
    titles = titles || [];
    if ( titles.length > 0 ) {
        var url = '/query/bulkdownload?';
        var len = titles.length;
        for ( var ii = 0; ii < len; ii++ ) {
            url = url + 'titles=' + titles[ii];
            if ( ii < len-1 ) {
                url = url + '&';
            }
        }
        $window.open(url);
    }
};

我只在IE11中对此进行了测试。

2020-07-04