此问题之前已被问过,但我见过的解决方案似乎都没有用,可能是因为我将文件流回浏览器的方式。我最终想要的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并解析数据变量中文件的内容。
答案 0 :(得分:1)
原因可能是浏览器阻止了新窗口。 允许所有网站在浏览器设置中显示弹出窗口。
您可以通过不同的方式尝试使用node
在fs
创建文件,并将网址返回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);
});
}