2009-10-06 6 views
7

Nous cherchons depuis longtemps à trouver une réponse à cette question, mais nous n'avons pas trouvé de solution.Télécharger le navigateur complete event

Nous avons un serveur Web, qui permet à l'utilisateur de télécharger des fichiers (pdfs), qui sont générés dynamiquement et servis à partir de servlets. Nous aimerions savoir quand un téléchargement est terminé (et comment: a-t-il réussi, a-t-il échoué, l'utilisateur a-t-il annulé?).

Y at-il un moyen de le savoir sans intervention de l'utilisateur? Ces fichiers sont relativement petits, donc aucune fonctionnalité de barre de progression n'est nécessaire, mais nous avons besoin d'une sorte de "crochet d'extrémité" qui rapporte quand le téléchargement est terminé. Est-ce possible? [Edit] Quelle serait la capacité du navigateur à détecter la fin du téléchargement et à rendre compte au serveur via ajax?

Répondre

3

Sauf si vous obtenez une erreur de réseau, vous ne pouvez pas savoir. Le seul moyen est d'avoir le navigateur pour envoyer un deuxième événement au serveur (en utilisant AJAX) pour accuser réception du téléchargement.

+2

Comment le navigateur pourrait-il savoir si le téléchargement s'est terminé avec succès? Ce fut l'essentiel de ma question en fait, je vais modifier pour le rendre plus clair – laura

+9

Pourquoi cette réponse a été acceptée? Nous ne savons toujours pas comment le navigateur peut savoir que le téléchargement est terminé – abyx

+0

laura, pourquoi avez-vous attribué cette réponse?) – dnim

1

Même si les fichiers sont petits, si vous utilisez la méthode setContentLength de ServletResponse l'utilisateur sera en mesure de faire la distinction entre une erreur et un bon téléchargement, et le gestionnaire de téléchargement de leur navigateur leur dira quand il est terminé.

2

L'utilisateur qui annule peut parfois être détecté dans une servlet. À l'aide de Tomcat par exemple, essayez de diffuser un fichier volumineux sur le client, puis annulez le téléchargement. Vous pouvez voir la stacktrace de l'exception dans logs/catalona.out. Je ne suis pas sûr, cependant, que cela peut être géré dans servlet lui-même ou un niveau inférieur (à l'intérieur catalina).

Il existe une approche de préchargement (avec l'écouteur d'événement facilité) habituellement utilisée pour télécharger des images. Il appartient au navigateur de télécharger le PDF en entier ou non s'il le détecte comme une image non prise en charge, mais cela vaut la peine d'essayer. Here est un exemple.

Une autre solution consisterait à télécharger implicitement le PDF en utilisant <object> ou <embed> et en utilisant leur écouteur d'événement onload. Non que cela ne fonctionne que si un ActiveX ou une sorte d'association de fichiers PDF est faite dans le navigateur, et ne fonctionnera probablement pas si l'utilisateur n'a pas de visionneuse PDF. Here est un exemple démontrant cela (voir la solution assistée: 11/21/04 08:22 AM, ID: 12638846).

Mohsen

6

Vous pouvez obtenir une assez bonne idée du serveur qui est connecté au navigateur directement (le point final de connexion TCP). Le serveur reçoit une erreur d'E/S lorsque l'utilisateur annule le téléchargement ou rencontre un problème réseau. Donc, si vous pouvez exécuter le serveur directement (sans proxy). Vous pouvez faire quelque chose comme ça,

try { 
     response.setContentType("application/pdf"); 
     response.setContentLength(bytes.length); 
     ServletOutputStream ouputStream = response.getOutputStream(); 
     ouputStream.write(bytes, 0, bytes.length); 
     ouputStream.flush(); 
     ouputStream.close(); 
     logger.info("PDF " + fileName + " sent successfully"); 
    } catch (Exception e) { 
     logger.error("PDF " + fileName + " error: " + e.getMessage()); 
     throw e; 
    } 

Cependant, il y a encore une petite chance que l'utilisateur ne peut pas voir le PDF dans le navigateur après le téléchargement réussi. ACK du navigateur sera la meilleure approche. Vous ne pouvez pas faire cela si PDF est affiché directement par le navigateur. Vous devez utiliser une sorte de visionneuse de PDF Javascript et ajouter un rappel au serveur quand il est affiché.

1

Le navigateur nativement ne gère pas cela, mais vous pouvez utiliser Google Gears pour gérer la demande de téléchargement (il déclencherait un événement de succès lorsque le téléchargement a été terminé).

http://code.google.com/apis/gears/api_httprequest.html

0

Si vous pouvez insérer un champ d'image dans vos documents, le href d'image peut pointer vers votre serveur pour confirmer que l'utilisateur a ouvert le document pdf.

Je n'ai pas essayé cela moi-même mais en regardant le last page of this adobe doc semble possible. Si vous utilisez Itext, il ne prend pas en charge les champs d'image, mais vous pouvez utiliser un modèle PDF avec le champ d'image pour créer vos documents et ajouter le javascript pour affecter l'URL au champ d'image.