Ho una pagina che consente all'utente di scaricare un file generato dinamicamente. Ci vuole molto tempo per generare, quindi mi piacerebbe mostrare un indicatore di "attesa". Il problema è che non riesco a capire come rilevare quando il browser ha ricevuto il file, quindi posso nascondere l'indicatore.
Sto effettuando la richiesta in una forma nascosta, che invia al server e indirizza un iframe nascosto per i suoi risultati. Questo è quindi non sostituisco l'intera finestra del browser con il risultato. Ascolto un evento "load" sull'iframe, nella speranza che si attivi al termine del download.
Restituisco un'intestazione "Disposizione contenuto: allegato" con il file, che fa sì che il browser mostri la finestra di dialogo "Salva". Ma il browser non genera un evento "load" nell'iframe.
Un approccio che ho provato è l'utilizzo di una risposta in più parti. Quindi invierebbe un file HTML vuoto, così come il file scaricabile allegato. Per esempio:
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
Questo funziona in Firefox; riceve il file HTML vuoto, genera l'evento "load", quindi mostra la finestra di dialogo "Salva" per il file scaricabile. Ma fallisce su IE e Safari; IE genera l'evento "load" ma non scarica il file e Safari scarica il file (con nome e tipo di contenuto errati) e non attiva l'evento "load".
Un approccio diverso potrebbe essere quello di effettuare una chiamata per avviare la creazione del file, quindi eseguire il polling del server fino a quando non è pronto, quindi scaricare il file già creato. Ma preferirei evitare di creare file temporanei sul server.
Qualcuno ha un'idea migliore?