2016-10-06 86 views
0

这是我目前有:如何下载一个ZIP文件在所有浏览器

express.js

app.get('/downloadZip', function(req, res) { 
    var file = req.query.downloadURL; 
    var filename = path.basename(file); 
    var mimetype = 'application/zip'; 

    res.setHeader('Content-disposition', 'attachment'); 
    res.setHeader('Content-type', mimetype); 

    var filestream = fs.createReadStream(file); 
    filestream.pipe(res); 
}); 

我控制器

$http({ 
    method: "GET", 
    url: '/downloadZip', 
    params: { 
    downloadURL: 'myZip.zip' 
    }, 
    responseType: 'arraybuffer' 
}).then(
    function success(data, status, headers, config) { 
    $log.debug('downloadZip success: ', data); 

    var blob = new Blob([data], {type: 'application/octet-stream'}); 
    // using FileSaver.js 
    saveAs(blob, 'newZipName.zip'); 
    }, 
    function error(error) { 
    $log.debug('downloadZip error: ', error); 
    }); 

通过这种方法,它似乎找到文件确定 - $log.debug输出显示一个5Mb的ArrayBuffer为data,这是正确的文件大小。但是,文件总是以1Kb的格式下载,显然无法打开。

我想在上面的例子中使用FileSaver.js,但我也尝试使用angular.element('<a/>')等 - 它总是导致1Kb的下载。

有什么我可以做的,以正确下载完整的ZIP?

编辑:

我想通了 - 见下面的回答。这些愚蠢的错误之一。但至少有一些很好的免费代码以上谁想要下载邮政编码;)

+0

如果你能告诉我你是什么网站是我可能会打破它。 '/ downloadZip?downloadURL = package.json' – Endless

+0

@Endless有趣。你能建议一个更安全的方法吗? – Locotes

回答

0

所有我需要的是data.data

因为这是接收到的data对象的内容:

Object {data: ArrayBuffer, status: 200, config: Object, statusText: "OK"} 

所以我不得不指定包含ArrayBuffer孩子data ...

var blob = new Blob([data.data], {type: 'application/octet-stream'}); 
相关问题