2009-01-07 6 views
5

Dans notre projet actuel, nous fournissons un téléchargement PDF qui peut être personnalisé par l'utilisateur via un formulaire HTML qu'il soumet. Il faut plusieurs secondes pour générer dynamiquement le PDF et je voudrais visualiser cela, par exemple. en désactivant le bouton d'envoi jusqu'à ce que le téléchargement commence. Malheureusement, je n'ai pas trouvé de moyen de détecter quand le téléchargement commence *. Donc, je ne sais pas quand réactiver le bouton de soumission.Existe-t-il un moyen de détecter le début d'un téléchargement en JavaScript?

J'ai déjà essayé de spécifier un IFrame comme cible de mon formulaire HTML, en espérant que l'événement onload serait déclenché. Ce n'est pas le cas, probablement parce que le PDF est envoyé avec un en-tête "Content-disposition: attachment" et qu'il n'est pas réellement chargé dans le IFrame. La seule solution que je puisse penser maintenant consiste à générer le fichier PDF sur un fichier temporaire sur le serveur, que je voudrais éviter. *) Permettez-moi de clarifier ceci: je n'aurais pas besoin de savoir si le téléchargement était terminé ou même si c'était vraiment commencé. Je voudrais détecter le point auquel le navigateur demandera à l'utilisateur d'ouvrir ou de sauvegarder le fichier. Je suppose que cela se produit lorsque le navigateur reçoit l'en-tête HTTP.

+0

Voulez-vous savoir quand le téléchargement commence ou quand il se termine? De toute façon, je ne pense pas qu'un fichier temporaire fera la différence. Du côté client, vous ne pouvez pas savoir si le fichier était installé sur le serveur ou généré à la volée. – Prestaul

+0

Donc, vous soumettez le formulaire, et la réponse à cette demande est un fichier PDF? Pendant la pause, le navigateur est dans le mode où il attend une réponse du serveur? est-ce correct? – Breton

+0

@Breton: correct! @Pretaul: Je voudrais savoir quand le téléchargement commence. Ainsi, je pourrais créer un fichier temporaire, fournir une réponse HTML à l'IFrame caché, puis récupérer le fichier temporaire par JavaScript dans le gestionnaire onload. –

Répondre

2

Ce que vous voulez, c'est pouvoir détecter quand la taille du fichier téléchargé passe de 0 à une valeur positive. Pour autant que je sache, il est impossible de faire cela avec javascript - vous avez besoin d'un plug-in qui peut accéder au système de fichiers du client.

Un travail recommandé autour de: Créer une session par téléchargement. Demandez au client d'interroger le serveur sur l'état du téléchargement. Cela pourrait être "non existant", "non commencé", "commencé", "fini". Vous avez besoin d'un travail côté serveur pour persister et mettre à jour le statut du téléchargement plus un framework AJAX.

+0

Merci pour votre réponse! Je ne me soucie pas vraiment du téléchargement réel (dans un fichier), sachant quand l'en-tête de réponse HTTP est reçu suffirait. Je ne suis pas encore convaincu, que cela ne peut pas être fait en javascript. –

+0

Votre suggestion de travail est un peu plus complexe que ce que je cherchais.Mais je suppose que cela fonctionnerait et c'est sûrement la meilleure idée jusqu'à présent. –

+0

Je ne suis toujours pas convaincu qu'il existe une meilleure solution. Mais j'ai implémenté l'idée de session/statut maintenant, donc j'accepte cette réponse. Merci encore. –

0

La solution la plus simple serait d'estimer le temps (généreusement) et de le faire de cette façon. C'est un hack, mais il donne l'effet désiré. L'autre option pourrait être de soumettre le formulaire avec un rappel en utilisant Ajax pour soumettre le formulaire et avoir les détails de retour du générateur à la page d'appel. http://www.jquery.com/ peut être un bon point de départ pour cette option.

4

Si j'étais vous, je ferais un appel AJAX au serveur avec les informations, génèrerais le fichier, puis retournerais le nom de fichier/id/quelquechose au javascript, ce qui ferait de window.location quelque chose comme download.php ? id = x (mais le fichier a déjà été généré, il suffit donc de définir les en-têtes et de le lire), auquel cas vous pouvez réactiver l'envoi.

+0

Merci pour votre réponse! Ce que vous décrivez est la solution de «fichier temporaire» que j'ai mentionnée et que j'aimerais éviter. –

+0

Ooo, mes excuses. Totalement n'a pas vu cette partie. –

Questions connexes