2010-06-10 13 views
14

Necesito mostrar una barra de progreso al usuario que solicita un archivo para descargar. Estoy usando la aplicación J2EE para generar el archivo. El usuario enviará los datos del formulario para obtener el archivo. El servidor toma todos los datos enviados manipula, genera y envía un archivo PDF de nuevo al cliente.Mostrando una barra de progreso al descargar un archivo desde el servidor

Así que quiero mostrar una barra de progreso al usuario hasta que el archivo llegue al lado del cliente. ¿Hay alguna manera de hacer esto?

+1

ME ENCANTARÍA saber cómo hacerlo –

+0

¿Cuánto tiempo demora en generar el archivo? – cherouvim

+0

@cherouvim: El tiempo no es estático aquí. Varía de un archivo a otro. Lleva un tiempo mínimo de 1 segundo hasta un máximo de 20-30 minutos. –

Respuesta

9

Si le entiendo bien, quiere mostrar una barra de progreso hasta que su servidor esté listo para enviar un archivo, no para mostrar el progreso del archivo descargado.

Si eso es cierto, se trata de un ejercicio difícil. Una barra de progreso confiable necesita saber (bastante exactamente) lo que está haciendo y cuánto tiempo llevará. En su caso, hay muchos factores poco fiables (uno de ellos, tal vez el más grande, es la propia red).

Por lo tanto, la mayoría de los desarrolladores utilizan algún tipo de animación "interminable" para mostrar el "trabajo en progreso".

actualización

Basado en su comentario, la forma más sencilla de mostrar un "trabajo en progreso" animación se vería como

$.ajax({ 
    url:  "/myscripts/myserverscript", 
    type:  "POST", 
    data:  { 
     foo: "bar" 
    }, 
    dataType: "text", 
    beforeSend: function(xhr){ 
     // display a progress animation 
    }, 
    complete: function(xhr, status){ 
     // hide the animation 
    } 
    ... 
}); 

En el caso de una única solicitud. También puede configurar un controlador de eventos ajax global para ambos (.ajaxStart() y .ajaxStop()) para configurar el show/hide functionallity.

Referencias: .ajax(), .ajaxStart(), bar .ajaxStop()

+0

Cualquiera de los casos es válido. Será bueno saber el progreso del archivo que se está descargando. O aún estoy de acuerdo con mostrar una barra de trabajo en progreso hasta que el servidor esté listo para enviar el archivo. –

+0

Gracias por su respuesta. –

+1

+1 por la simplicidad de "espera infinita" – cherouvim

3

progreso para la generación de archivos del servidor lado:

Suponemos que el servidor necesita muchos segundos para generar el archivo. Este evento se desencadena por la solicitud original, una operación de bloqueo. Cuando esto finalice, el archivo se habrá generado y se enviará nuevamente al cliente.

Al mismo tiempo, desea, a través de otras solicitudes (ajax), llamar al servidor y obtener un porcentaje para el archivo que se está generando actualmente para el usuario en particular.

partes el pegamento aquí son:

  • cuando la solicitud original está generando el archivo que necesita para almacenar el progreso en intervalos frecuentes (es decir, cada 10%). Almacenar esta información en la sesión http funcionará bien.
  • las otras solicitudes (ajax) simplemente necesitan poder extraer esta información de la sesión http
  • sincronización (acceso de serialización) en la sesión http, algo que algunas aplicaciones web suelen hacer, está fuera de discusión, ya que las otras solicitudes (ajax) simplemente bloquearían hasta que la solicitud original finalizara
  • en el lado del cliente, todo es html + javascript para proporcionar la interacción que necesita (barra de progreso animado). Incluso si los intervalos son muy difíciles (saltando de 10% a 20% a 30%) puede animar la barra con jQuery. Lo hice una vez en el pasado y se ve genial.

barra de progreso para la descarga de archivos:

lo mejor es dejar esto al diálogo nativo del navegador.

+0

¿Puedo saber cómo se obtiene la información de descarga del archivo html/java-script? ¿Puedes compartir más información sobre el último punto de lo que dijiste (del lado del cliente es todo ...)? –

+0

En el lado del servidor, necesitará una URL (por ejemplo, un servlet Java) que proporcione esta información (simplemente imprima el porcentaje de la sesión http). Si esto será texto sin formato (por ejemplo, "20%") o JSON o XML depende de usted y de cómo implementará el lado del cliente. En el lado del cliente, hará solicitudes asíncronas en la URL a través de jQuery para obtener esta información y modificar el DOM en consecuencia. Las solicitudes deberán activarse cada X segundos (digamos 3 segundos) a través de la función javascript setTimeout (...) – cherouvim

+0

Para ese tipo de enfoque, sugeriría realmente algún tipo de COMET, no solicitudes nativas de ajax. – jAndy

0

En Java simplemente envuelve un javax.swing.ProgressMonitorInputStream alrededor de la secuencia de entrada, pero tenga en cuenta que a menos que el servidor esté enviando en modo de transmisión por fragmentos, la pantalla no significará nada, ya que toda la respuesta se habrá leído en la memoria antes de que el primer byte se entregue a Java.

Cuestiones relacionadas