Если бы мы были на узлеJS-сервере, мы могли бы написать заголовок, установить тип mime и отправить его:
res.header("Content-Disposition", "attachment;filename="+name+".csv");
res.type("text/csv");
res.send(200, csvString);
и из-за заголовков браузер создаст загрузку для названного файла csv.
Когда полезные данные генерируются в браузере, одно из решений для его получения в CSV файле - использовать ajax, загрузить его на сервер (возможно, при необходимости сохранить его там) и заставить сервер отправлять его с этими заголовками для загрузки csv в браузере.
Тем не менее, я бы хотел, чтобы 100% -ное решение для браузера не включало пинг-понг с сервером.
Поэтому мне пришло в голову, что можно открыть новое окно и попытаться установить заголовок с эквивалентом тега META.
Но это не работает для меня в недавнем Chrome.
Я получаю новое окно и содержит csvString, но не выполняет функцию загрузки.
Думаю, я ожидал получить либо загрузку на нижней вкладке, либо пустое новое окно с загрузкой на нижней вкладке.
Мне интересно, правильны ли метатеги или нужны ли другие теги.
Есть ли способ выполнить эту работу, не нажимая на сервер?
JsFiddle для создания CSV в браузере (не работает - выводит окно, но без загрузки)
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);