簡體   English   中英

nodejs中的大文件下載失敗

[英]large files failing download in nodejs

我有一個構建 csv 文件並將其返回給用戶的服務。 目前使用 expressjs v4.14,nodejs v8.7.0。 我的問題是,當我調用服務以創建大型 csv 文件時,由於 chrome 中的“網絡錯誤”導致下載失敗。 對於較小的文件,該服務工作正常。 我還可以瀏覽到/temp/文件夾,並且整個預期文件都存在。 在“我嘗試過的事情”的每種情況下,我都能夠下載較小的文件,但不能下載較大的文件。

服務:

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 的網絡選項卡和開發者控制台沒有告訴我發生了什么。 這個下載彈出窗口是我得到的。 為了以防萬一,我清除了 cookie/cache 中的所有內容,但沒有幫助。

在此處輸入圖片說明

我嘗試過的事情:

  • 將塊直接寫入響應流。
  • 使用可讀流https://nodejs.org/api/stream.html#stream_readable_streams ,將 String 轉換為字節並進行管道傳輸。
  • 在本地創建一個文件(寫入流)並將其流回(讀取流管道到 res)
  • 寫入流創建本地文件結束后的 res.download(file)

更新:

最終嘗試了郵遞員的服務並且它起作用了,所以我認為這是一個 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) {

    });

原來是 angularjs 中創建的錨標記的href屬性的限制。 這是使用FileSaver解決的:

$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 file = new File([data], "info.csv", {type: "text/csv;charset=utf-8"});
           saveAs(file);
}).error(function (data, status, headers, config) {

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM