使用Angular

时间:2017-03-12 14:34:56

标签: angularjs node.js

此问题之前已被问过,但我见过的解决方案似乎都没有用,可能是因为我将文件流回浏览器的方式。我最终想要的CSV是私有S3存储桶,由于安全中间件,我必须通过NodeJS端点获取它。 API的代码如下。

exports.download = function(req, res) {

    var recording = req.vsRecording,
        s3 = new AWS.S3();

    if(recording.data_uri){
        try{
            res.set('Content-Type', 'application/octet-stream');
            var fileStream = s3.getObject({Bucket: 'processing-dispatched', Key: recording._id + '/aggregated.csv'}).createReadStream();
            fileStream.pipe(res);
        }
        catch(err){
            res.status(500).json({error: err});
        }
    }
    else {
        res.status(500).json({error: 'Recording does not have a report file.'});
    }
};

这非常有效,我可以将文件内容恢复到浏览器中。当它出错时,试图将该内容作为文件下载打开。有没有一种特殊的方法来处理下载流?

我最接近的是客户端上的这段代码,如果我关闭adblocker,它有时似乎可以在localhost上运行 - 但是在生产中不起作用。

$scope.download = function(){
    Report.download($state.params.recordingId).then(function(data){
    var csvContent = "data:text/csv;charset=utf-8," + data.toString();
    var encodedUri = encodeURI(csvContent);
    window.open(encodedUri);
});

Report.download只是我的Node端点周围的一个角度服务包装器,它返回一个promise并解析数据变量中文件的内容。

1 个答案:

答案 0 :(得分:1)

原因可能是浏览器阻止了新窗口。 允许所有网站在浏览器设置中显示弹出窗口。

您可以通过不同的方式尝试使用nodefs创建文件,并将网址返回Front-end

您可以尝试以下代码

$scope.download = function() {
Report.download($state.params.recordingId).then(function(data) {
    var csvContent = "data:text/csv;charset=utf-8," + data.toString();
    var a = document.createElement('a');
    a.href = "data:application/csv;charset=utf-8," + csvContent;
    a.setAttribute('download', "abc.csv");
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
 });
}