Pregunta

En nuestro proyecto actual, ofrecemos una descarga de PDF que el usuario puede personalizar a través de un formulario HTML que envía. Se tarda varios segundos en generar dinámicamente el PDF y me gustaría visualizarlo, por ejemplo. desactivando el botón de enviar hasta que comience la descarga. Desafortunadamente, no pude encontrar una manera de detectar cuándo comienza la descarga *. Así que no sabría cuándo volver a habilitar el botón de envío.

Ya intenté especificar un IFrame como el destino de mi formulario HTML, con la esperanza de que se activara el evento onload . Sin embargo, no lo es, probablemente porque el PDF se envía con un " Content-disposition: attachment " encabezado y no está realmente cargado en el IFrame.

La única solución que se me ocurre ahora es generar el PDF en un archivo temporal en el servidor, lo que me gustaría evitar.

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

¿Fue útil?

Solución

Lo que desea es poder detectar cuándo el tamaño del archivo descargado cambia de 0 a un valor positivo. Por lo que sé, es imposible hacer eso con javascript: necesita un complemento que pueda acceder al sistema de archivos del cliente.

Una solución alternativa recomendada: cree una sesión por descarga. Haga que el cliente encueste al servidor sobre el estado de la descarga. Esto podría ser "no existió", "no iniciado", "iniciado", "terminado". Necesita algún trabajo lateral del servidor para persistir y actualizar el estado de la descarga más un marco AJAX.

Otros consejos

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

La solución más simple sería estimar el tiempo (generosamente) y hacerlo de esa manera. Es un hack, 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/ puede ser un buen lugar para comenzar con esa opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top