Últimamente he estado jugando con WebGL y he conseguido que funcione un lector Collada. El problema es que es bastante lento (Collada es un formato muy detallado), así que voy a comenzar a convertir archivos a un formato más fácil de usar (probablemente JSON). Ya tengo el código para analizar el archivo en JavaScript, ¡así que también puedo usarlo como mi exportador! El problema es el ahorro.
Ahora, sé que puedo analizar el archivo, enviar el resultado al servidor y hacer que el navegador solicite el archivo del servidor como descarga. Pero en realidad el servidor no tiene nada que ver con este proceso en particular, entonces, ¿por qué involucrarse? Ya tengo el contenido del archivo deseado en la memoria. ¿Hay alguna forma de presentarle al usuario una descarga usando JavaScript puro? (Lo dudo, pero bien podría preguntar ...)
Y para ser claros: ¡no estoy tratando de acceder al sistema de archivos sin el conocimiento de los usuarios! El usuario proporcionará un archivo (probablemente mediante arrastrar y soltar), el script transformará el archivo en la memoria y se le pedirá al usuario que descargue el resultado. Todo lo cual debería ser actividades "seguras" en lo que respecta al navegador.
[EDITAR]: No lo mencioné por adelantado, por lo que los carteles que respondieron "Flash" son lo suficientemente válidos, pero parte de lo que estoy haciendo es un intento de resaltar lo que se puede hacer con HTML5 puro ... así que Flash es justo en mi caso. (Aunque es una respuesta perfectamente válida para cualquiera que esté haciendo una aplicación web "real"). En ese caso, parece que no tengo suerte a menos que quiera involucrar al servidor. ¡Gracias de cualquier manera!
fuente
Respuestas:
OK, crear un dato: URI definitivamente hace el truco para mí, ¡gracias a Matthew y Dennkster señalando esa opción! Aquí es básicamente cómo lo hago:
1) obtenga todo el contenido en una cadena llamada "contenido" (por ejemplo, al crearlo allí inicialmente o al leer innerHTML de la etiqueta de una página ya creada).
2) Construir el URI de datos:
Habrá limitaciones de longitud según el tipo de navegador, etc., pero, por ejemplo, Firefox 3.6.12 funciona hasta al menos 256k. En cambio, codificar en Base64 usando encodeURIComponent podría hacer que las cosas sean más eficientes, pero para mí eso estuvo bien.
3) abra una nueva ventana y "rediríjalo" a este URI solicita una ubicación de descarga de mi página generada en JavaScript:
Eso es.
fuente
location.href
el contenido.location.href = uriContent
.location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());
y guardará el contenido de la respuesta de @ Nøk en un archivo. No tengo IE para probarlo, pero funciona para webkit.Solución simple para navegadores listos para HTML5 ...
Uso
fuente
HTML5 definió un
window.saveAs(blob, filename)
método. No es compatible con ningún navegador en este momento. Pero hay una biblioteca de compatibilidad llamada FileSaver.js que agrega esta función a la mayoría de los navegadores modernos (incluido Internet Explorer 10+). Internet Explorer 10 admite unnavigator.msSaveBlob(blob, filename)
método ( MSDN ), que se utiliza en FileSaver.js para la compatibilidad con Internet Explorer.Escribí una publicación de blog con más detalles sobre este problema.
fuente
Guardar archivos grandes
Los URI de datos largos pueden dar problemas de rendimiento en los navegadores. Otra opción para guardar archivos generados del lado del cliente es colocar su contenido en un objeto Blob (o Archivo) y crear un enlace de descarga usando
URL.createObjectURL(blob)
. Esto devuelve una URL que puede usarse para recuperar el contenido del blob. El blob se almacena dentro del navegador hasta queURL.revokeObjectURL()
se llame en la URL o se cierre el documento que lo creó. La mayoría de los navegadores web admiten URL de objetos , Opera Mini es el único que no los admite.Forzando una descarga
Si los datos son texto o una imagen, el navegador puede abrir el archivo, en lugar de guardarlo en el disco. Para hacer que el archivo se descargue al hacer clic en el enlace, puede usar el
download
atributo. Sin embargo, no todos los navegadores web admiten el atributo de descarga . Otra opción es usarloapplication/octet-stream
como el tipo mime del archivo, pero esto hace que el archivo se presente como un blob binario que es especialmente amigable para el usuario si no puede o no puede especificar un nombre de archivo. Consulte también ' Forzar para abrir la ventana emergente "Guardar como ..." abierta en el enlace de texto, haga clic para acceder al pdf en HTML "Especificando un nombre de archivo
Si el blob se crea con el constructor de archivos, también puede establecer un nombre de archivo, pero solo unos pocos navegadores web (incluidos Chrome y Firefox) tienen soporte para el constructor de archivos . El nombre de archivo también se puede especificar como argumento para
download
atributo, pero esto está sujeto a un montón de consideraciones de seguridad . Internet Explorer 10 y 11 proporciona su propio método, msSaveBlob , para especificar un nombre de archivo.Código de ejemplo
fuente
msSaveBlob
para abrir el cuadro de diálogo "Guardar como". Para otros navegadores, su única opción es elegir manualmente "Guardar como" en el menú contextual del enlace de descarga.document.getElementById('link').href = url;
, su código puede seguir adelante y disparar el enlace utilizando el.click()
método del elemento .fuente
a.click
con código usandodocument.createEvent()
como Matěj Pokorný sugirió, funciona en FF pero no en IE. No he probado Chrome.Echar un vistazo a Doug Neiner Downloadify que es una interfaz basada en Flash JavaScript para hacer esto.
fuente
HTML 5
banner y etiquetar en consecuencia? Es probable que eso atraiga a los usuarios que conocen ese campo específico (supongo que todavía es una multitud relativamente pequeña en este momento). Estoy bastante seguro de que se puede hacer en HTML 5, pero no tengo idea de cómo.¡Solución simple!
Funciona en todos los navegadores modernos.
fuente
window.open()
. Es irrelevante Podrías usar este método y forzarlo.click()
, pero mira el tiempo ya que a Firefox no le gusta si llamas.click()
antes de dejar que el elemento se una al cuerpo.Puede generar un URI de datos . Sin embargo, hay limitaciones específicas del navegador.
fuente
"data:text/plain;charset=UTF-8,"+encodeURIComponent(text)
pero sí, IE limita el tamaño de las URL de datos a una cantidad inutilizable y no las admite para cosas comowindow.open(...)
o iframes (creo).He usado FileSaver ( https://github.com/eligrey/FileSaver.js ) y funciona bien.
Por ejemplo, hice esta función para exportar los registros que se muestran en una página.
Tienes que pasar una matriz para la instanciación del Blob, así que quizás no escribí esto de la manera correcta, pero funciona para mí.
Por si acaso, tenga cuidado con el reemplazo: esta es la sintaxis para hacer esto global, de lo contrario solo reemplazará el primero que encuentre.
fuente
w.close();
después de laexecCommand
Encontré dos enfoques simples que funcionan para mí. Primero, usando un
a
elemento ya hecho clic e inyectando los datos de descarga. Y segundo, generar una
elemento con los datos de descarga, ejecutarlosa.click()
y eliminarlos nuevamente. Pero el segundo enfoque solo funciona si es invocado por una acción de clic del usuario también. (Algunos) El navegador se bloqueaclick()
desde otros contextos, como al cargar o se activa después de un tiempo de espera (setTimeout).fuente
a
documento (posiblemente con"display:none"
), hacer clic en él y luego eliminarlo.Aquí hay un enlace al método URI de datos que Mathew sugirió, funcionó en un safari, pero no bien porque no pude establecer el tipo de archivo, se guarda como "desconocido" y luego tengo que ir allí nuevamente más tarde y cambiarlo en orden para ver el archivo ...
http://www.nihilogic.dk/labs/canvas2image/
fuente
Puedes usar localStorage. Este es el equivalente Html5 de las cookies. Parece que funciona en Chrome y Firefox PERO en Firefox, necesitaba subirlo a un servidor. Es decir, las pruebas directamente en la computadora de mi casa no funcionaron.
Estoy trabajando en ejemplos HTML5. Vaya a http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html y desplácese hasta el laberinto. La información para reconstruir el laberinto se almacena utilizando localStorage.
Llegué a este artículo buscando JavaScript HTML5 para cargar y trabajar con archivos xml. ¿Es lo mismo que html y JavaScript anteriores?
fuente
tratar
Si quieres descargar datos binarios mira aquí
Actualizar
2020.06.14 Actualizo Chrome a 83.0 y superior SO snippet stop funciona (debido a restricciones de seguridad de sandbox ) - pero la versión JSFiddle funciona - aquí
fuente
Como se mencionó anteriormente, la API de archivos , junto con las API FileWriter y FileSystem, se pueden usar para almacenar archivos en la máquina de un cliente desde el contexto de una pestaña / ventana del navegador.
Sin embargo, hay varias cosas relacionadas con las dos últimas API que debe tener en cuenta:
Aquí hay ejemplos simples de cómo se usan las API, directa e indirectamente, en conjunto para hacer esto:
Productos horneados *
Uso de las API de File, FileWriter y FileSystem sin formato
Aunque las API FileSystem y FileWriter ya no están en el camino de los estándares, su uso puede justificarse en algunos casos, en mi opinión, porque:
Sin embargo, si "algunos casos" abarca los suyos, es decisión suya.
* BakedGoods es mantenido por nada menos que este tipo aquí :)
fuente
Este hilo fue invaluable para descubrir cómo generar un archivo binario y solicitar la descarga del archivo nombrado, todo en código de cliente sin servidor.
El primer paso para mí fue generar el blob binario a partir de los datos que estaba guardando. Hay muchas muestras para hacer esto para un solo tipo binario, en mi caso tengo un formato binario con múltiples tipos que puede pasar como una matriz para crear el blob.
El siguiente paso es hacer que el navegador solicite al usuario que descargue este blob con un nombre predefinido.
Todo lo que necesitaba era un enlace con nombre que agregué en HTML5 que podía reutilizar para cambiar el nombre del nombre de archivo inicial. Lo mantuve oculto ya que el enlace no necesita visualización.
El último paso es solicitar al usuario que descargue el archivo.
fuente
Aquí hay un tutorial para exportar archivos como ZIP:
Antes de comenzar, hay una biblioteca para guardar archivos, el nombre de la biblioteca es fileSaver.js. Puede encontrar esta biblioteca aquí. Comencemos, ahora, incluya las bibliotecas requeridas:
Ahora copie este código y este código descargará un archivo zip con un archivo hello.txt con contenido Hello World. Si todo funciona bien, esto descargará un archivo.
Esto descargará un archivo llamado file.zip. Puede leer más aquí: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library
fuente