No estoy seguro de si esto es posible utilizando tecnologías web estándar.
Quiero que el usuario pueda descargar varios archivos en una sola acción. Es decir, haga clic en las casillas de verificación junto a los archivos y luego obtenga todos los archivos que se marcaron.
¿Es posible? Si es así, ¿qué estrategia básica recomienda? Sé que puedo usar la tecnología de cometas para crear eventos del lado del servidor que desencadenan una HttpResponse, pero espero que haya una forma más sencilla.
http
web-applications
download
Ankur
fuente
fuente
fuente
link.setAttribute('download', null);
renombré todos mis archivos a nulos.link.setAttribute('download',filename)
interior del bucle. Esto le permite nombrar los archivos como desee. Además, creo que solo debe ser el nombre del archivo sin incluir la URL. Terminé enviando dos matrices: una con la URL completa y otra con solo el nombre del archivo.Minecraft.jar
.Puede crear un conjunto temporal de iframes ocultos, iniciar la descarga mediante GET o POST dentro de ellos, esperar a que comiencen las descargas y eliminar iframes:
O, sin jQuery:
fuente
setTimeout()
?Esta solución funciona en todos los navegadores y no genera advertencias. En lugar de crear un
iframe
, aquí creamos un enlace para cada archivo. Esto evita que aparezcan mensajes de advertencia.Para manejar la parte de bucle, usamos
setTimeout
, que es necesario para que funcione en IE.fuente
Google Chrome Version 76.0.3809.100 (Official Build) (64-bit)
.La forma más sencilla sería servir los múltiples archivos agrupados en un archivo ZIP.
Supongo que podría iniciar múltiples descargas de archivos usando un montón de iframes o ventanas emergentes, pero desde el punto de vista de la usabilidad, un archivo ZIP es aún mejor. ¿Quién quiere hacer clic en diez cuadros de diálogo "Guardar como" que mostrará el navegador?
fuente
Estoy de acuerdo en que un archivo zip es una solución más ordenada ... Pero si tiene que enviar varios archivos, esta es la solución que se me ocurrió. Funciona en IE 9 y versiones posteriores (posiblemente una versión inferior también, no lo he probado), Firefox, Safari y Chrome. Chrome mostrará un mensaje al usuario para obtener su consentimiento para descargar varios archivos la primera vez que su sitio lo use.
El único efecto secundario de esta técnica es que el usuario verá un retraso entre el envío y el cuadro de diálogo de descarga. Para minimizar este efecto, le sugiero que utilice la técnica que se describe aquí y en esta pregunta Detectar cuando el navegador recibe la descarga de un archivo que consiste en establecer una cookie con su archivo para saber que ha comenzado la descarga. Deberá verificar esta cookie en el lado del cliente y enviarla en el lado del servidor. No olvide establecer la ruta adecuada para su cookie o es posible que no la vea. También deberá adaptar la solución para la descarga de varios archivos.
fuente
Una versión jQuery del iframe responde:
fuente
download(['http://nogin.info/cv.doc','http://nogin.info/cv.doc']);
Sin embargo, esto no funciona para descargar archivos de imagen.Solución angular:
ejemplo de trabajo: https://plnkr.co/edit/XynXRS7c742JPfCA3IpE?p=preview
fuente
Para mejorar la respuesta de @Dmitry Nogin: esto funcionó en mi caso.
Sin embargo, no se ha probado, ya que no estoy seguro de cómo funciona el diálogo del archivo en varias combinaciones de sistema operativo / navegador. (Por lo tanto, wiki de la comunidad).
fuente
Esto funciona en todos los navegadores (IE11, firefox, Edge, Chrome y Chrome Mobile). Mis documentos están en varios elementos seleccionados. Los navegadores parecen tener problemas cuando intentas hacerlo demasiado rápido ... Así que utilicé un tiempo de espera.
Esta es una solución que usa promesas:
fuente
De lejos, la solución más fácil (al menos en ubuntu / linux):
Funciona de maravilla.
fuente
Para resolver esto, creé una biblioteca JS para transmitir múltiples archivos directamente en un zip en el lado del cliente. La principal característica única es que no tiene límites de tamaño de memoria (todo se transmite) ni formato zip (usa zip64 si el contenido es de más de 4GB).
Dado que no realiza compresión, también es muy eficaz.
¡Busque "downzip" en npm o github !
fuente
La siguiente secuencia de comandos hizo este trabajo con gracia.
fuente
Estoy buscando una solución para hacer esto, pero descomprimir los archivos en javascript no fue tan limpio como me gustaba. Decidí encapsular los archivos en un solo archivo SVG.
Si tiene los archivos almacenados en el servidor (yo no), simplemente puede configurar el href en el SVG.
En mi caso, convertiré los archivos a base64 y los incrustaré en el SVG.
Editar: El SVG funcionó muy bien. Si solo va a descargar los archivos, ZIP podría ser mejor. Si va a mostrar los archivos, SVG parece superior.
fuente
Al usar componentes Ajax, es posible iniciar múltiples descargas. Por lo tanto, debe usar https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
Agregue una instancia de AJAXDownload a su página o lo que sea. Cree un AjaxButton y anule onSubmit. Cree un AbstractAjaxTimerBehavior y comience a descargar.
¡Feliz descarga!
fuente
Debajo del código 100% funcionando.
Paso 1 : pegue el código siguiente en el archivo index.html
Paso 2 : pegue el código siguiente en el archivo index.js
NOTA : Asegúrese de que los tres archivos que se van a descargar se coloquen en la misma carpeta junto con los archivos angularProject / index.html o angularProject / index.js .
fuente
Obtener una lista de URL con una llamada ajax y luego usar el complemento jquery para descargar varios archivos en paralelo.
fuente
Esta es la forma en que lo hago. Abro varios ZIP pero también otro tipo de datos (exporto el proyecto en PDF y al mismo tiempo muchos ZIP con documento).
Solo copio parte pasada de mi código. La llamada de un botón en una lista:
Entonces, una llamada básica a una rutina JS (¡reglas de vainilla!). aquí está la rutina JS:
El truco es NO dar el enlace directo del archivo ZIP sino enviarlo al navegador. Me gusta esto:
fuente
fuente