Comment créer un fichier dans la mémoire pour l'utilisateur de télécharger, mais pas par le biais du serveur?
Est-il possible que je peux créer un fichier texte sur le côté client et invite l'utilisateur à télécharger, sans aucune interaction avec le serveur?
Je sais que je ne peux pas écrire directement à leur machine (sécurité et tout et tout), mais je peux les créer et de les inciter à le sauver?
- Voir aussi: JavaScript: Créer et enregistrer le fichier
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser les données Uri. Prise en charge du navigateur varie; voir Wikipédia. Exemple:
L'octet-stream est de forcer une fenêtre de téléchargement. Sinon, il va probablement ouvrir dans le navigateur.
Pour CSV, vous pouvez utiliser:
Essayer le jsFiddle démo.
a
éléments.<a>
attributdownload="filename.txt"
et javascript.click()
vous pouvez automatiser le processus.Solution Simple pour HTML5 prêt navigateurs...
JS:
CSS:
HTML:
Utilisation
download
attribut vous pouvez spécifier le nom de fichier 😉txt
extension si vous ne fournissez pas une extension dans le nom de fichier. Si vous nedownload("data.json", data)
il va fonctionner comme prévu.data:text/plain;base64
firefox de ne pas le télécharger.JSON.stringify(item, undefined, "\t").replace(/\n/g, "\r\n");
. Lorsque j'imprime le texte sur la console, immédiatement avant de l'insérer dans les données uri, je peux voir qu'elle contient \r\n, cependant, quand j'ouvre le fichier enregistré ceux qui sont partis. Je pense que je ferais mieux d'ouvrir une question.Toutes les solutions ci-dessus ne fonctionne pas dans tous les navigateurs. Voici ce que, enfin, fonctionne sur internet explorer 10+, Firefox et Chrome (et sans jQuery ou toute autre bibliothèque):
Note que, selon votre situation, vous pouvez également appeler URL.revokeObjectURL après la suppression de
elem
. Selon les docs pour URL.createObjectURL:window.URL.revokeObjectURL(elem.href);
après la suppression deelem
sur Firefox 48 résultats dans la fenêtre de téléchargement ne jamais apparaître et le téléchargement ne jamais commencer. Retrait de l'appel àrevokeObjectURL()
résout ce problème. Pour AngularJS 1.x des applications, je suppose que vous pouvez construire un tableau d'Url qui sont nettoyées de détruire du contrôleur.encodeURI(content)
?Failed: network error
dans google Chrome. Celui-ci fonctionne bien.Tous l'exemple ci-dessus fonctionne très bien sur chrome et IE, mais ne parviennent pas dans Firefox.
S'il vous plaît ne considérez ajoutant un point d'ancrage pour le corps et l'enlever après cliquez sur.
a.click()
ligne parce qu'il pense que le blob URL est cross-origin.Je suis heureux à l'aide de FileSaver.js. Sa compatibilité est très bonne (IE10+ et tout le reste), et il est très simple à utiliser:
<a>
.<a download="...">
. Je ne suis pas sûr si/comment FileSaver.js prend en charge cette.La méthode suivante fonctionne dans IE11+, Firefox 25+ et google Chrome 30+:
Le voir en Action: http://jsfiddle.net/Kg7eA/
Firefox et Chrome en charge les données de URI pour la navigation, ce qui nous permet de créer des fichiers en accédant à des données URI, alors que IE ne prend pas en charge pour des raisons de sécurité.
Sur l'autre main, c'est à dire a des API pour l'enregistrement d'un blob, qui peut être utilisé pour créer et télécharger des fichiers.
Cette solution est extraite directement à partir de tiddlywiki (la tiddlywiki.com) dépôt github. J'ai utilisé tiddlywiki dans presque tous les navigateurs, et il fonctionne comme un charme:
Dépôt Github:
Télécharger l'économiseur d'module
Solution que de travailler sur IE10:
(J'ai besoin d'un fichier csv, mais il suffit de changer le type et le nom du fichier txt)
Si vous voulez convertir une chaîne de caractères à être disponible pour le téléchargement vous pouvez essayer ce à l'aide de jQuery.
Comme mentionné avant, filesaver est un grand paquet pour travailler avec des fichiers sur le côté client. Mais, il n'est pas bien avec de gros fichiers. StreamSaver.js est une solution alternative (qui est pointé dans FileServer.js) qui peut gérer de gros fichiers:
En avril 2014, FileSytem Api peut ne pas être normalisé par le W3C. Toute personne à la recherche à la solution avec de blob devrait fil avec précaution, je suppose.
HTML5 rocks heads up
W3C Liste de Diffusion sur FileSytem API
Basé sur @Rick réponse qui a été vraiment utile.
Vous avez à scape la chaîne
data
si vous voulez partager de cette façon:`
Désolé je ne peux pas commenter sur @la réponse de Rick à cause de mon faible réputation dans StackOverflow.
Un edit suggestion a été partagé et rejeté.
Le paquet js-téléchargement de fichier de github.com/kennethjiang/js-file-download poignées de bord de cas pour la prise en charge du navigateur:
L'affichage de la source de voir comment il utilise les techniques mentionnées sur cette page.
Installation
Utilisation
Vous pouvez même faire mieux que juste d'URI - à l'aide de Chrome, vous êtes également en mesure de suggérer le nom du fichier, comme expliqué dans ce billet de blog à propos de nommage de téléchargement lors de l'utilisation d'URIs.
En-dessous de la fonction travaillé.
Pour moi cela a fonctionné parfaitement, avec le même nom de fichier et l'extension de l'obtention téléchargé
<a href={"data:application/octet-stream;charset=utf-16le;base64," + file64 } download={title} >{title}</a>
"titre" est le nom de fichier avec l'extension je.e,
sample.pdf
,waterfall.jpg
, etc..'file64' est le base64 content de quelque chose comme cela, je.e,
Ww6IDEwNDAsIFNsaWRpbmdTY2FsZUdyb3VwOiAiR3JvdXAgQiIsIE1lZGljYWxWaXNpdEZsYXRGZWU6IDM1LCBEZW50YWxQYXltZW50UGVyY2VudGFnZTogMjUsIFByb2NlZHVyZVBlcmNlbnQ6IDcwLKCFfSB7IkdyYW5kVG90YWwiOjEwNDAsIlNsaWRpbmdTY2FsZUdyb3VwIjoiR3JvdXAgQiIsIk1lZGljYWxWaXNpdEZsYXRGZWUiOjM1LCJEZW50YWxQYXltZW50UGVyY2VudGFnZSI6MjUsIlByb2NlZHVyZVBlcmNlbnQiOjcwLCJDcmVhdGVkX0J5IjoiVGVycnkgTGVlIiwiUGF0aWVudExpc3QiOlt7IlBhdGllbnRO
Si le fichier contient des données de texte, une technique que j'utilise est de mettre le texte dans un textarea élément et demandez à l'utilisateur de sélectionner (cliquer dans le textarea puis ctrl-A), puis les copier suivie par un coller dans un éditeur de texte.
Il EST réellement possible - utiliser le Flash.
Vous pouvez soit générer du contenu avec JS et ensuite initialiser certains flash vars ou tout simplement faire le tout dans une animation flash.
Veuillez jeter un oeil à cette pour quelques remarques importantes.