2009-01-07 42 views
5

En nuestro proyecto actual, ofrecemos una descarga de PDF que el usuario puede personalizar a través de un formulario HTML que envía. Lleva varios segundos generar el PDF dinámicamente y me gustaría visualizar esto, p. Ej. desactivando el botón de enviar hasta que comience la descarga. Desafortunadamente, no pude encontrar una manera de detectar cuándo comienza la descarga *. Entonces no sabría cuándo reactivar el botón de enviar.¿Hay alguna forma de detectar el inicio de una descarga en JavaScript?

Ya he intentado especificar un IFrame como destino de mi formulario HTML, con la esperanza de que se active el evento onload. No lo es, sin embargo, probablemente porque el PDF se envía con un encabezado "Content-disposition: attachment" y no se carga realmente en el IFrame.

La única solución en la que puedo pensar ahora implica generar el PDF en un archivo temporal en el servidor, lo que me gustaría evitar.

*) Permítanme aclarar esto: no necesitaría saber si la descarga se completó o si realmente se inició. Me gustaría detectar el punto en el que el navegador le preguntará al usuario si abrir o guardar el archivo. Supongo que esto sucede cuando el navegador recibe el encabezado HTTP.

+0

¿Desea saber cuándo comienza la descarga o cuándo se completa? De cualquier manera, no creo que un archivo temporal haga la diferencia. En el lado del cliente, no se puede decir si el archivo estaba en el servidor o se generó sobre la marcha. – Prestaul

+0

¿Entonces envía el formulario y la respuesta a este envío es un archivo PDF? Durante la pausa, ¿el navegador está en el modo en el que está esperando una respuesta del servidor? ¿es esto correcto? – Breton

+0

@Breton: ¡correcto! @Pretaul: me gustaría saber cuándo comienza la descarga. Entonces, podría crear un archivo temporal, entregar alguna respuesta HTML al IFrame oculto y luego buscar el archivo temporal por JavaScript en el controlador de carga. –

Respuesta

2

Lo que quiere es poder detectar cuando el tamaño del archivo descargado cambia de 0 a un valor positivo. Por lo que sé, es imposible hacer eso con javascript; necesitas un complemento que pueda acceder al sistema de archivos del cliente.

Se recomienda un trabajo alternativo: cree una sesión por descarga. Haga que el cliente consulte al servidor sobre el estado de la descarga. Esto podría ser "no existente", "no iniciado", "iniciado", "terminado". Necesita algún trabajo adicional del servidor para conservar y actualizar el estado de la descarga más un marco AJAX.

+0

Gracias por su respuesta! Realmente no me importa la descarga real (a un archivo), saber cuándo se recibirá el encabezado de respuesta HTTP sería suficiente. Todavía no estoy del todo convencido de que esto no se pueda hacer en javascript. –

+0

Su trabajo sugerido es un poco más complejo de lo que estaba buscando.Pero supongo que funcionaría y seguramente es la mejor idea hasta ahora. –

+0

Todavía no estoy del todo convencido de que haya una mejor solución. Pero implementé la idea de sesión/estado ahora, así que aceptaré esta respuesta. Gracias de nuevo. –

0

La solución más simple sería estimar el tiempo (generosamente) y hacerlo de esa manera. Es un truco, pero da el efecto deseado. La otra opción podría ser enviar el formulario con una devolución de llamada utilizando Ajax para enviar el formulario y hacer que el generador devuelva los detalles a la página de llamada. http://www.jquery.com/ podría ser un buen lugar para comenzar con esa opción.

4

Si yo fuera usted, haría una llamada AJAX al servidor con la información, generaría el archivo, luego devolvería el nombre del archivo/id/lo que sea al javascript, lo que entonces hace que window.location sea algo así como download.php ? id = x (pero el archivo ya se generó, por lo que es solo establecer los encabezados y leerlo), en cuyo momento puede volver a habilitar el envío.

+0

¡Gracias por su respuesta! Lo que está describiendo es la solución de "archivo temporal" que mencioné y que me gustaría evitar. –

+0

Ooo, mis disculpas. Totalmente no vi esa parte. –

Cuestiones relacionadas