Comment pouvez-vous dire si l'utilisateur a frappé annuler pendant un téléchargement à partir d'un servlet Java?

StackOverflow https://stackoverflow.com/questions/3679260

Question

Comment pouvez-vous dire si l'utilisateur a frappé annuler pendant un téléchargement à partir d'un servlet Java? Ce qui semble se produire pour moi avec IE, le flux de sortie des blocs println (). Le coup utilisé annuler, mais est-il un moyen de temps ceci ou quelque chose comme ça?

Était-ce utile?

La solution

Wrap OutputStream#write(), #flush() et #close() dans un bloc de try-catch sur IOException. Si vous êtes pris, il en général signifie que l'utilisateur final a annulé la demande.

Pour obtenir un peu plus loin, vous pouvez également prendre à une exception plus spécifique à servletcontainer comme ClientAbortException sur Tomcat et des clones (qui est une sous-classe de IOException), mais cela rendra votre code webapp à d'autres servletcontainers non portable.


Mise à jour : revenir sur la question de blocage, vous souhaitez appeler flush() après avoir écrit un seul bloc de données. Cette volonté en fait envoyer les données au client et la cause IOException lorsque la prise sous-jacente est fermée.

Autres conseils

Vous ne serez pas en mesure de dire à coup sûr. Cela dépend de la façon dont votre conteneur de servlet est mis en œuvre.

Lorsque l'utilisateur touche « Annuler », le navigateur doit fermer le socket. Ce sera détectable par le serveur, bien sûr, mais si le serveur a le ServletOutputStream « plumbed » directement au OutputStream de la prise dépend de la mise en œuvre. Dans le cas contraire, un IOException sera soulevé la prochaine fois que les servlets tentatives de données d'écriture.

Si les tampons de conteneurs sortie, le servlet pourrait juste terminer l'écriture de données et de ne jamais rien savoir se clochait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top