最佳答案
如果我们在一个 nodeJS 服务器上,我们可以写一个头,设置一个 mime 类型,然后发送它:
res.header("Content-Disposition", "attachment;filename="+name+".csv");
res.type("text/csv");
res.send(200, csvString);
由于头部的原因,浏览器会为指定的 csv 文件创建一个下载。
当有用的数据在浏览器中生成时,一个解决方案是使用 ajax,将数据上传到服务器(也许可以选择保存在那里) ,然后让服务器将数据和这些头一起发送回浏览器,成为一个 CSV 下载。
但是,我想要一个100% 的浏览器解决方案,不涉及乒乓球与服务器。
因此,我想到,可以打开一个新的窗口,并尝试设置与 META 标签等价的标题。
但是在最近的 Chrome 浏览器中,这并不适合我。
我得到了一个新窗口,它包含 csvString,但不作为下载。
我猜我希望在底部选项卡中下载,或者在一个空白的新窗口中在底部选项卡中下载。
我想知道 meta 标签是否正确,或者是否还需要其他标签。
有没有一种方法可以让这个工作而不用把它放到服务器上?
用于在浏览器中创建 CSV 的 JsFiddle (不是工作输出窗口,但没有下载)
var A = [['n','sqrt(n)']]; // initialize array of rows with header row as 1st item
for(var j=1;j<10;++j){ A.push([j, Math.sqrt(j)]) }
var csvRows = [];
for(var i=0,l=A.length; i<l; ++i){
csvRows.push(A[i].join(',')); // unquoted CSV row
}
var csvString = csvRows.join("\n");
console.log(csvString);
var csvWin = window.open("","","");
csvWin.document.write('<meta name="content-type" content="text/csv">');
csvWin.document.write('<meta name="content-disposition" content="attachment; filename=data.csv"> ');
csvWin.document.write(csvString);