2
我有一個服務可以構建一個csv文件並將其返回給用戶。目前使用expressjs v4.14,nodejs v8.7.0。我的問題是,當我調用服務爲它創建一個大的csv文件時,由於chrome中的「網絡錯誤」而導致下載失敗。對於較小的文件,該服務工作正常。我也可以瀏覽到/temp/
文件夾,並且存在整個預期文件。在每一件'我試過的東西'中,我都可以下載較小的文件,但不能下載較大的文件。無法在nodejs中下載大文件
服務:
download.post('/csv', (req, res, next) => {
res.status(200).header('Content-Type', 'text/csv');
const newUUID = uuid.v1();
let ws: WriteStream = fs.createWriteStream(`${__dirname}/../../temp/${newUUID}.csv`);
ws.on('finish',() => {
res.download(`${__dirname}/../../temp/${newUUID}.csv`);
});
//csv file built here
ws.write('huge stuff easily 50k rows and 10 mb file');
ws.end();
});
Chrome的錯誤:
Chrome的網絡標籤和開發者控制檯不給我發生了什麼事的任何指示。這下載彈出是我得到的。爲了以防萬一,我清除了Cookie /緩存中的所有內容,並沒有幫助。
事情我想:直接
- 寫入塊,以響應流。
- 使用可讀流https://nodejs.org/api/stream.html#stream_readable_streams,將字符串轉換爲字節並管道它。
- 創建本地文件(writestream)後結束writestream創建本地文件流媒體回來(readstream管排入水庫)
- res.download(文件)
更新:
端試圖從郵遞員服務,它的工作,所以我認爲這是一個angularjs問題。
Angularjs
$http({
cache: false,
url: "/download/csv",
headers: {
'accept': 'text/csv'
},
method: 'POST',
data: {
rows: rows,
title: title ? title : ''
}
}).success(function (data, status, headers, config) {
var anchor = angular.element('<a/>');
anchor.attr({
href: 'data:attachment/csv;charset=utf-8,' + encodeURI(data),
target: '_blank',
download: 'csv_info.csv'
})[0].click();
}).error(function (data, status, headers, config) {
});