J'ai joué avec WebGL ces derniers temps et j'ai réussi à faire fonctionner un lecteur Collada. Le problème est qu'il est assez lent (Collada est un format très détaillé), donc je vais commencer à convertir des fichiers dans un format plus facile à utiliser (probablement JSON). J'ai déjà le code pour analyser le fichier en JavaScript, je peux donc aussi bien l'utiliser que mon exportateur! Le problème est la sauvegarde.
Maintenant, je sais que je peux analyser le fichier, envoyer le résultat au serveur et que le navigateur demande le fichier au serveur en téléchargement. Mais en réalité, le serveur n'a rien à voir avec ce processus particulier, alors pourquoi l'impliquer? J'ai déjà le contenu du fichier souhaité en mémoire. Existe-t-il un moyen de présenter à l'utilisateur un téléchargement à l'aide de JavaScript pur? (J'en doute, mais autant demander ...)
Et pour être clair: je n'essaie pas d'accéder au système de fichiers à l'insu des utilisateurs! L'utilisateur fournira un fichier (probablement par glisser-déposer), le script transformera le fichier en mémoire et l'utilisateur sera invité à télécharger le résultat. Toutes ces activités devraient être des activités «sûres» en ce qui concerne le navigateur.
[EDIT]: Je ne l'ai pas mentionné d'avance, donc les affiches qui ont répondu "Flash" sont suffisamment valides, mais une partie de ce que je fais est une tentative de mettre en évidence ce qui peut être fait avec du HTML5 pur ... alors Flash est dans mon cas. (Bien que ce soit une réponse parfaitement valable pour quiconque fait une "vraie" application web.) Cela étant, il semble que je n'ai pas de chance, sauf si je veux impliquer le serveur. Merci quand même!
la source
Réponses:
OK, création de données: l'URI fait définitivement l'affaire pour moi, grâce à Matthew et Dennkster qui ont souligné cette option! Voici essentiellement comment je le fais:
1) obtenir tout le contenu dans une chaîne appelée "contenu" (par exemple en le créant initialement ou en lisant innerHTML de la balise d'une page déjà construite).
2) Créez l'URI de données:
Il y aura des limitations de longueur en fonction du type de navigateur, etc., mais par exemple Firefox 3.6.12 fonctionne jusqu'à au moins 256k. Le codage en Base64 à la place à l'aide d'encodeURIComponent pourrait rendre les choses plus efficaces, mais pour moi, c'était ok.
3) ouvrir une nouvelle fenêtre et la "rediriger" vers cet URI vous invite à indiquer l'emplacement de téléchargement de ma page générée par JavaScript:
C'est tout.
la source
location.href
le contenu.location.href = uriContent
.location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());
et elle enregistrera le contenu de la réponse de @ Nøk dans un fichier. Je n'ai pas IE pour le tester, mais cela fonctionne pour le webkit.Solution simple pour les navigateurs compatibles HTML5 ...
Usage
la source
HTML5 a défini une
window.saveAs(blob, filename)
méthode. Il n'est actuellement pris en charge par aucun navigateur. Mais il existe une bibliothèque de compatibilité appelée FileSaver.js qui ajoute cette fonction à la plupart des navigateurs modernes (y compris Internet Explorer 10+). Internet Explorer 10 prend en charge unenavigator.msSaveBlob(blob, filename)
méthode ( MSDN ), qui est utilisée dans FileSaver.js pour la prise en charge d'Internet Explorer.J'ai écrit un article de blog avec plus de détails sur ce problème.
la source
Enregistrement de fichiers volumineux
Les URI de données longues peuvent entraîner des problèmes de performances dans les navigateurs. Une autre option pour enregistrer les fichiers générés côté client consiste à placer leur contenu dans un objet Blob (ou fichier) et à créer un lien de téléchargement à l'aide de
URL.createObjectURL(blob)
. Cela renvoie une URL qui peut être utilisée pour récupérer le contenu du blob. Le blob est stocké dans le navigateur jusqu'à ce que soitURL.revokeObjectURL()
appelé sur l'URL ou que le document qui l'a créé soit fermé. La plupart des navigateurs Web prennent en charge les URL d'objet , Opera Mini est le seul qui ne les prend pas en charge.Forcer un téléchargement
Si les données sont du texte ou une image, le navigateur peut ouvrir le fichier au lieu de l'enregistrer sur le disque. Pour provoquer le téléchargement du fichier en cliquant sur le lien, vous pouvez utiliser le
download
attribut. Cependant, tous les navigateurs Web ne prennent pas en charge l'attribut de téléchargement . Une autre option consiste à utiliserapplication/octet-stream
comme type mime du fichier, mais cela entraîne la présentation du fichier comme un blob binaire qui est particulièrement peu convivial si vous ne spécifiez pas ou ne pouvez pas spécifier un nom de fichier. Voir aussi ' Forcer à ouvrir la fenêtre contextuelle "Enregistrer sous ..." ouverte au lien texte, cliquez pour le pdf en HTML '.Spécification d'un nom de fichier
Si le blob est créé avec le constructeur de fichiers, vous pouvez également définir un nom de fichier, mais seuls quelques navigateurs Web (y compris Chrome et Firefox) prennent en charge le constructeur de fichiers . Le nom de fichier peut également être spécifié comme argument du
download
attribut, mais cela est soumis à une tonne de considérations de sécurité . Internet Explorer 10 et 11 fournit sa propre méthode, msSaveBlob , pour spécifier un nom de fichier.Exemple de code
la source
msSaveBlob
pour ouvrir la boîte de dialogue "Enregistrer sous". Pour les autres navigateurs, votre seule option est de choisir manuellement "Enregistrer sous" dans le menu contextuel du lien de téléchargement.document.getElementById('link').href = url;
, votre code peut continuer et lancer le lien en utilisant la.click()
méthode de l'élément .la source
a.click
par du code utilisantdocument.createEvent()
comme suggéré par Matěj Pokorný, cela fonctionne sur FF mais pas sur IE. Je n'ai pas essayé Chrome.Jetez un oeil à Doug Neiner Downloadify qui est une interface JavaScript basé sur Flash pour ce faire.
la source
HTML 5
bannière et étiqueter en conséquence? Cela serait susceptible d'attirer les utilisateurs qui connaissent ce domaine spécifique (encore une foule relativement petite en ce moment, je suppose). Je suis sûr que cela peut être fait en HTML 5 mais je ne sais pas comment.Solution simple!
Fonctionne dans tous les navigateurs modernes.
la source
window.open()
. Ce n'est pas pertinent. Vous pouvez utiliser cette méthode et y forcer un.click()
, mais surveillez le timing car Firefox ne l'aime pas si vous appelez.click()
avant de laisser l'élément s'attacher au corps.Vous pouvez générer un URI de données . Cependant, il existe des limitations spécifiques au navigateur.
la source
"data:text/plain;charset=UTF-8,"+encodeURIComponent(text)
Mais oui, IE limite la taille des URL de données à une quantité inutilisable et il ne les prend pas en charge pour des choses commewindow.open(...)
ou des iframes (je pense).J'ai utilisé FileSaver ( https://github.com/eligrey/FileSaver.js ) et cela fonctionne très bien.
Par exemple, j'ai fait cette fonction pour exporter les journaux affichés sur une page.
Vous devez passer un tableau pour l'instanciation du Blob, donc je n'ai peut-être pas écrit cela correctement, mais cela fonctionne pour moi.
Au cas où, soyez prudent avec le remplacement: c'est la syntaxe pour rendre cela global, sinon il ne remplacera que le premier qu'il rencontre.
la source
w.close();
après leexecCommand
J'ai trouvé deux approches simples qui fonctionnent pour moi. Tout d'abord, en utilisant un
a
élément déjà cliqué et en injectant les données de téléchargement. Et deuxièmement, générer una
élément avec les données de téléchargement, les exécutera.click()
et les supprimer à nouveau. Mais la deuxième approche ne fonctionne que si elle est également invoquée par une action de clic d'un utilisateur. (Certains) Blocageclick()
du navigateur provenant d'autres contextes comme lors du chargement ou déclenché après un délai d'attente (setTimeout).la source
a
dans le document (éventuellement avec"display:none"
), cliquer dessus, puis le supprimer.Voici un lien vers la méthode URI de données suggérée par Mathew, cela a fonctionné sur safari, mais pas bien parce que je n'ai pas pu définir le type de fichier, il est enregistré comme "inconnu" et ensuite je dois y retourner plus tard et le changer dans l'ordre pour visualiser le fichier ...
http://www.nihilogic.dk/labs/canvas2image/
la source
Vous pouvez utiliser localStorage. Il s'agit de l'équivalent Html5 des cookies. Il semble fonctionner sur Chrome et Firefox MAIS sur Firefox, je devais le télécharger sur un serveur. Autrement dit, les tests directement sur mon ordinateur personnel n'ont pas fonctionné.
Je travaille sur des exemples HTML5. Accédez à http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html et faites défiler jusqu'au labyrinthe. Les informations pour reconstruire le labyrinthe sont stockées à l'aide de localStorage.
Je suis venu à cet article à la recherche de JavaScript HTML5 pour charger et travailler avec des fichiers xml. Est-ce la même chose que les anciens HTML et JavaScript ????
la source
essayer
Si vous souhaitez télécharger des données binaires, regardez ici
Mettre à jour
2020.06.14 J'ai mis à niveau Chrome vers 83.0 et au-dessus de l'arrêt de l'extrait de code SO (en raison des restrictions de sécurité du sandbox ) - mais la version JSFiddle fonctionne - ici
la source
Comme mentionné précédemment, l' API File , ainsi que les API FileWriter et FileSystem peuvent être utilisées pour stocker des fichiers sur la machine d'un client à partir du contexte d'un onglet / d'une fenêtre de navigateur.
Cependant, il y a plusieurs choses concernant les deux dernières API que vous devez connaître:
Voici des exemples simples de la façon dont les API sont utilisées, directement et indirectement, en tandem pour ce faire:
BakedGoods *
Utilisation des API File, FileWriter et FileSystem brutes
Bien que les API FileSystem et FileWriter ne soient plus sur la voie des normes, leur utilisation peut être justifiée dans certains cas, à mon avis, parce que:
Toutefois, vous devez décider si "certains cas" englobent les vôtres.
* BakedGoods est maintenu par nul autre que ce gars ici :)
la source
Ce fil était inestimable pour comprendre comment générer un fichier binaire et inviter à télécharger le fichier nommé, le tout en code client sans serveur.
La première étape pour moi a été de générer le blob binaire à partir des données que je sauvegardais. Il y a beaucoup d'exemples pour le faire pour un seul type binaire, dans mon cas, j'ai un format binaire avec plusieurs types que vous pouvez passer comme un tableau pour créer le blob.
L'étape suivante consiste à demander au navigateur d'inviter l'utilisateur à télécharger ce blob avec un nom prédéfini.
Tout ce dont j'avais besoin était un lien nommé que j'ai ajouté dans le HTML5 que je pouvais réutiliser pour renommer le nom de fichier initial. Je l'ai gardé caché car le lien n'a pas besoin d'être affiché.
La dernière étape consiste à inviter l'utilisateur à télécharger le fichier.
la source
Voici un tutoriel pour exporter des fichiers au format ZIP:
Avant de commencer, il existe une bibliothèque pour enregistrer les fichiers, le nom de la bibliothèque est fileSaver.js, vous pouvez trouver cette bibliothèque ici. Commençons, incluons maintenant les bibliothèques requises:
Copiez maintenant ce code et ce code téléchargera un fichier zip avec un fichier hello.txt ayant un contenu Hello World. Si tout fonctionne correctement, cela téléchargera un fichier.
Cela va télécharger un fichier appelé file.zip. Vous pouvez en savoir plus ici: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library
la source