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

Using Angularjs to converting a string from node into a file download

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

https://www.google.com/finance/historical?q=NYSEARCA:SPY&output=csv

这似乎是一个非常简单的问题,但让我感到困惑。有人对此有什么想法吗?

V

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

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 options and Here'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>