Якби ми були на сервері nodeJS, ми могли б написати заголовок, встановити тип 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);