鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。
我的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)); }; };
//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>}
欢迎提出建议,澄清,答案等!
我更新了我的bulkdownload方法,$window.open(...)而不是使用$http.get(...):
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中对此进行了测试。