2016-10-06 124 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'}); 
相關問題