est le suivant: J'ai une page d'accueil où j'affiche un diagramme qui a été construit en utilisant des valeurs séparées par des virgules à l'intérieur de la page. Je voudrais donner aux utilisateurs la possibilité de télécharger les données sous forme de fichier cvs sans contacter à nouveau le serveur. (car les données sont déjà là) Est-ce possible? Je préférerais une solution JavaScript pure.
Jusqu'à présent, j'ai découvert: http://pixelgraphics.us/downloadify/test.html mais cela implique un flash que j'aimerais éviter.
Je ne peux pas imaginer que cette question n'a pas été posée auparavant. Je suis désolé de doubler le post, mais il semble que j'aie utilisé les mauvais mots-clés ou quelque chose - je n'ai pas trouvé de solution dans ces forums.
Mise à jour :
Le temps change certainement les choses ;-) Quand j'ai répondu pour la première fois à cette question IE8 était le dernier IE navigateur disponible (Nov 2010 ) et il n'y avait donc pas de moyen multi-navigateur pour y parvenir sans aller-retour vers le serveur, ou en utilisant un outil nécessitant Flash.
@ la réponse de Zectburno vous fournira ce dont vous avez besoin maintenant, mais pour le contexte historique, sachez quels IE navigateurs supportent quelle fonctionnalité.
Assurez-vous de tester dans les navigateurs que vous devez prendre en charge. Même si l'exemple Blob dans l'autre réponse devrait fonctionner dans IE10 +, cela ne fonctionne pas pour moi en cliquant simplement sur le lien (le navigateur ne fait rien, aucune erreur) ... uniquement si je clique avec le bouton droit et enregistre la cible en tant que "fichier.csv", puis accédez au fichier et double-cliquez dessus pour l'ouvrir.
Testez les deux approches (btoa/Blob) dans ce JSFiddle. (voici le code)
<!doctype html>
<html>
<head>
</head>
<body>
<a id="a" target="_blank">Download CSV (via btoa)</a>
<script>
var csv = "a,b,c\n1,2,3\n";
var a = document.getElementById("a");
a.href = "data:text/csv;base64," + btoa(csv);
</script>
<hr/>
<a id="a2" download="Download.csv" type="text/csv">Download CSV (via Blob)</a>
<script>
var csv = "a,b,c\n1,2,3\n";
var data = new Blob([csv]);
var a2 = document.getElementById("a2");
a2.href = URL.createObjectURL(data);
</script>
</body>
</html>
Réponse originale :
Je ne pense pas qu'il existe une option disponible pour cela.
Je voudrais juste ajuster votre code de sorte que si Flash 10+ est détecté ( saturation de 93% en septembre 2009 ) sur le système de l'utilisateur, fournissez l'option Downloadify, sinon revenez à une demande côté serveur.
Testé sur Safari 5, Firefox 6, Opera 12, Chrome 26.
<a id='a'>Download CSV</a>
<script>
var csv = 'a,b,c\n1,2,3\n';
var a = document.getElementById('a');
a.href='data:text/csv;base64,' + btoa(csv);
</script>
HTML5
<a id='a' download='Download.csv' type='text/csv'>Download CSV</a>
<script>
var csv = 'a,b,c\n1,2,3\n';
var data = new Blob([csv]);
var a = document.getElementById('a');
a.href = URL.createObjectURL(data);
</script>
Solution simple:
function download(content, filename, contentType)
{
if(!contentType) contentType = 'application/octet-stream';
var a = document.createElement('a');
var blob = new Blob([content], {'type':contentType});
a.href = window.URL.createObjectURL(blob);
a.download = filename;
a.click();
}
tilisation
download("csv_data_here", "filename.csv", "text/csv");
function export(exportAs) {
var csvText = tableRowsToCSV(this.headTable.rows);
csvText += tableRowsToCSV(this.bodyTable.rows);
//open the iframe doc for writing
var expIFrame;
if (strBrowser == "MSIE") expIFrame = document.exportiframe;
else expIFrame = window.framesexportiframe;
var doc = expIFrame.document;
doc.open('text/plain', 'replace');
doc.charset = "utf-8";
doc.write(csvText);
doc.close();
var fileName = exportAs + ".txt";
doc.execCommand("SaveAs", null, fileName);
}
function tableRowsToCSV(theRows) {
var csv = "";
var csvRow = "";
var theCells;
var cellData = "";
for (var r = 0; r < theRows.length; r++) {
theCells = theRows.item(r).cells;
for (var c = 0; c < theCells.length; c++) {
cellData = "";
cellData = theCells.item(c).innerText;
if (cellData.indexOf(",") != -1) cellData = "'" + cellData + "'";
if (cellData != "") csvRow += "," + cellData;
}
if (csvRow != "") csvRow = csvRow.substring(1, csvRow.length);
csv += csvRow + "\n";
csvRow = "";
}
return csv;
}
J'ai trouvé ce code ailleurs, ici , précédemment
Pour autant que je sache, ce n'est pas possible: c'est pourquoi Downloadify a été créé.
Vous pouvez essayer de créer un lien vers un data:URL
contenant des données CSV, mais il y aura des problèmes entre les navigateurs.
Si vos utilisateurs ont des navigateurs à jour, le nouvel objet Blob pourrait vous aider.
Sur la base de l'exemple ici https://developer.mozilla.org/en/docs/DOM/Blob ("Exemple d'utilisation du constructeur Blob"), vous pouvez faire quelque chose comme ceci:
var typedArray = "123,abc,456"; //your csv as a string
var blob = new Blob([typedArray], {type: "text/csv"});
var url = URL.createObjectURL(blob);
var a = document.querySelector("#linktocsv"); // the id of the <a> element where you will render the download link
a.href = url;
a.download = "file.csv";
La solution la plus complète que j'ai rencontrée utilise FileSaver.js , gérant de nombreux problèmes potentiels entre les navigateurs avec des solutions de secours.
Il tire parti de l'objet Blob
comme l'ont fait d'autres affiches, et le créateur crée même un Blob.js polyfill au cas où vous en auriez besoin pour prendre en charge les versions de navigateur qui ne prennent pas en charge Blob
HTML:
<a href="javascript:onDownload();">Download</a>
JavaScript:
function onDownload() {
document.location = 'data:Application/octet-stream,' +
encodeURIComponent(dataToDownload);
}
Tiré de Comment télécharger des données en tant que fichier à partir de JavaScript