Detectar cuando el navegador recibe descarga de archivos.

Tengo una página que permite al usuario descargar un archivo generado dinámicamente. Se necesita mucho tiempo para generar, por lo que me gustaría mostrar un indicador de "espera". El problema es que no puedo descubrir cómo detectar cuándo el navegador ha recibido el archivo, así que puedo ocultar el indicador.

Estoy realizando la solicitud de forma oculta, que se envía al servidor y se dirige a un iframe oculto para sus resultados. Esto es para que no reemplace toda la ventana del navegador con el resultado. Escucho un evento de "carga" en el iframe, con la esperanza de que se active cuando se complete la descarga.

Devuelvo un encabezado "Contenido-Disposición: archivo adjunto" con el archivo, lo que hace que el navegador muestre el cuadro de diálogo "Guardar". Pero el navegador no dispara un evento de "carga" en el iframe.

Un enfoque que probé es usar una respuesta de varias partes. Por lo tanto, enviaría un archivo HTML vacío, así como el archivo descargable adjunto. Por ejemplo:

Content-type: multipart/x-mixed-replace;boundary="abcde"

--abcde
Content-type: text/html

--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf

file-content
--abcde

Esto funciona en Firefox; recibe el archivo HTML vacío, dispara el evento "cargar", luego muestra el cuadro de diálogo "Guardar" para el archivo descargable. Pero falla en IE y Safari; IE dispara el evento de "carga" pero no descarga el archivo, y Safari descarga el archivo (con el nombre y el tipo de contenido incorrectos), y no dispara el evento de "carga".

Un enfoque diferente podría ser hacer una llamada para iniciar la creación del archivo, luego sondear el servidor hasta que esté listo y luego descargar el archivo ya creado. Pero prefiero evitar la creación de archivos temporales en el servidor.

¿Alguien tiene una idea mejor?

Respuestas a la pregunta(17)

Su respuesta a la pregunta