J'ai une page qui permet à l'utilisateur de télécharger un fichier généré dynamiquement. Cela prend beaucoup de temps à générer, je voudrais donc afficher un indicateur "d'attente". Le problème est que je ne sais pas comment détecter quand le navigateur a reçu le fichier, je peux donc masquer l'indicateur.
Je fais la demande sous une forme cachée, qui POSTE au serveur et cible une iframe cachée pour ses résultats. C'est ainsi que je ne remplace pas la totalité de la fenêtre du navigateur par le résultat. J'écoute un événement de "chargement" sur l'iframe, dans l'espoir qu'il se déclenche lorsque le téléchargement est terminé.
Je renvoie un en-tête "Content-Disposition: attachment" avec le fichier, ce qui fait que le navigateur affiche la boîte de dialogue "Enregistrer". Mais le navigateur ne déclenche pas un événement de "chargement" dans l'iframe.
Une approche que j'ai essayée utilise une réponse en plusieurs parties. Il enverrait donc un fichier HTML vide, ainsi que le fichier téléchargeable joint. Par exemple:
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
Cela fonctionne dans Firefox; il reçoit le fichier HTML vide, déclenche l'événement "charger", puis affiche la boîte de dialogue "Enregistrer" pour le fichier téléchargeable. Mais il échoue sur IE et Safari; IE déclenche l'événement "load" mais ne télécharge pas le fichier, et Safari télécharge le fichier (avec un nom et un type de contenu incorrects) et ne déclenche pas l'événement "load".
Une approche différente pourrait être de faire un appel pour démarrer la création du fichier, puis d'interroger le serveur jusqu'à ce qu'il soit prêt, puis de télécharger le fichier déjà créé. Mais je préfère éviter de créer des fichiers temporaires sur le serveur.
Quelqu'un a-t-il une meilleure idée?