大文件在nodejs中下载失败

时间:2017-10-18 16:06:43

标签: angularjs node.js express

我有一个构建csv文件的服务,并将其返回给用户。目前使用expressjs v4.14,nodejs v8.7.0。我的问题是,由于“网络错误”导致下载失败。在chrome中,当我调用它来创建一个大的csv文件服务时。使用较小的文件,该服务工作正常。我也可以浏览到/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错误:

Chrome的网络标签和开发者控制台没有告诉我发生了什么。这个下载弹出窗口就是我得到的。我清除了cookie /缓存中的所有内容,以防万一,但没有帮助。

enter image description here

我尝试的事情:

  • 直接将块写入响应流。
  • 使用可读流https://nodejs.org/api/stream.html#stream_readable_streams,将String转换为字节并对其进行管道传输。
  • 在本地创建文件(writestream)并将其重新流回(readstream pipe into res)
  • 写入流创建本地文件后
  • 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) {

    });

1 个答案:

答案 0 :(得分:1)

原来是来自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) {

});