使用Angularjs将字符串从节点转换为文件下载

时间:2015-09-04 01:25:29

标签: angularjs node.js stream

我正在尝试从节点服务调用(csv字符串)获取输出并将其作为文件流提供,以便可以下载。我尝试使用流和管道在Node站点上解决这个问题,但是当我用管道传输到stdout时,我的内容转到了控制台,而不是回到我的调用者。当我尝试从节点返回流时,几乎没有任何可检测到的事情发生。我有点得出结论,我正在尝试做的事情应该从Angular方面完成。我只需要获取输出并将其作为流提供,就像这个链接一样:

std::move(p_object)

这似乎是一个相当直接的问题,但它让我感到困惑。有人对此有什么想法吗?

V

1 个答案:

答案 0 :(得分:0)

您可以从服务器端和客户端执行此操作。从服务器,您只需告知客户端他们的数据是什么以及如何处理它:

function(req, res) {
    res.setHeader("Content-type", "text/csv");    
    res.setHeader("Content-disposition", "attachment; filename=my_data.csv")
    var data = "this,is,some,csv"
    res.write(data);
    res.end();
}

内容类型和处置的不同组合将向浏览器指示它应该对发送的数据做什么:

"content-type":"disposition"
"text/text":"attachment" -> download
"text/text":"inline" -> display on screen
"text/csv":"attachment" -> download
"text/csv":"inline" -> download

正如你可以看到的最后一个,有时客户忽略了你的建议。无论您的建议如何,它都会将媒体类型"text/csv"作为下载处理。 Here's a list of the content-disposition optionsHere's a list of media types

如果您有一些在客户端构建的数据并希望用户能够下载它:

您需要在compileProvider中将blob列入白名单。如果不这样做,则href将以“unsafe:”为前缀。默认白名单为http / https / ftp / mailto,因此您需要将blob附加到正则表达式:

var app = angular.module("myApp",[]);
app.config(function($compileProvider){
    $compileProvider.aHrefSanitizationWhitelist(/^\s*https?|ftp|mailto|blob):/);
})

你的控制器:

var content = "this,is,some,csv";
var blob = new Blob([content], {type: "text/csv"});
$scope.url = (window.URL || window.webkitURL).createObjectURL(blob);

你的HTML:

<a download="text.csv" ng-href="{{url}}">download</a>