私はcsvファイルを構築してユーザーに返します。現在、expressjs v4.14、nodejs v8.7.0を使用しています。私の問題は、大規模なcsvファイルを作成するためにサービスを呼び出すと、chromeの 'network error'のためにダウンロードが失敗するということです。小さなファイルでは、サービスは正常に動作します。 /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のネットワークタブとデベロッパーコンソールは私に何が起こったかのいずれかの表示を与えることはありません。このダウンロードポップアップは私が手に入れたものです。私はクッキー/キャッシュ内のすべてをクリアしましたが、それは役に立ちませんでした。
物事は私が試した:
- 書き込みチャンク直接応答ストリームに。
- 可読ストリームhttps://nodejs.org/api/stream.html#stream_readable_streamsを使用して、Stringをバイトに変換してパイプします。
- (writestream)ローカルファイルを作成し、終了writestream作成し、ローカルファイルの後に戻って(RESにreadstreamパイプ)
- res.download(ファイル)を、それをストリーミング
更新:
エンド郵便配達員からのサービスを試してみるとうまくいったので、それは角度の問題だと思う。 angularjsで作成されたアンカータグからhref
属性からの制限であることが判明
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) {
});