Tengo una página que permite al usuario descargar un archivo generado dinámicamente. Se tarda mucho tiempo en 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 haciendo la solicitud en una forma oculta, que POSTs al servidor, y apunta a un iframe oculto por 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 "Content-Disposition: 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, activa 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 "cargar" pero no descarga el archivo, y Safari descarga el archivo (con el nombre y tipo de contenido incorrectos) y no dispara el evento "cargar".
Un enfoque diferente podría ser hacer una llamada para comenzar la creación del archivo, luego sondear el servidor hasta que esté listo, luego descargar el archivo ya creado. Pero prefiero evitar crear archivos temporales en el servidor.
¿Alguien tiene una idea mejor?