2010-06-24 9 views
10

Je cours une servlet dans Tomcat 6.0.26. La servlet accepte le téléchargement de fichiers du client par HTTP POST. Je voudrais arrêter le téléchargement du fichier du côté HttpServlet. J'ai essayé les méthodes suivantes avec pas de chance:Comment fermer une connexion HTTP depuis le HttpServlet

  1. fermer la demande inputstream
  2. envoyer le code d'erreur HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE et la réponse flush
  3. faire 1 et 2 dans un filtre

I googlé mais trouvé aucune réponse directe. S'il vous plaît conseiller des solutions.

Merci.

Répondre

5

Ceci n'est pas possible en utilisant l'API standard Servlet ni Commons FileUpload. Fondamentalement, pour pouvoir annuler la connexion immédiatement, vous devez saisir physiquement la socket sous-jacente et la fermer. Cependant, cette socket est contrôlée par le serveur web. Voir aussi cette question connexe: How to explicitly terminate http connection from server with no response header.

Peu de tests ont cependant confirmé que Commons FileUpload ne met pas en mémoire tampon le fichier entier en mémoire lorsque sa taille dépasse la limite. Il lira le flux d'entrée, mais ignorera et jettera les octets lus (aussi ceux qui sont déjà lus). Donc, l'efficacité de la mémoire n'est pas nécessairement le problème ici.

Pour résoudre le problème réel, vous souhaitez essentiellement valider la taille du fichier côté client plutôt que côté serveur. Ceci est possible avec une applet Java ou une application Flash. Par exemple, respectivement JumpLoader et SWFUpload.

1

La question est beaucoup plus ou moins un double de Aborting upload from a servlet to limit file size

Avez-vous essayé en utilisant Apache Commons ?

Il existe une méthode setFileSizeMax dans un objet serveur représentant un téléchargement de fichier à partir d'une requête.

+0

J'ai essayé FileUpload mais cela ne fonctionne pas pour moi. Ce que je veux, c'est arrêter complètement le processus de téléchargement. Mais avec setFileSizeMax de FileUpload, cela n'empêchera pas le client de télécharger tout le contenu sur le serveur (ce qui coûte la bande passante du serveur). – Jason

+0

@Jason: Vous devez utiliser [streaming mode] (http://commons.apache.org/fileupload/streaming.html). Il lit par défaut le fichier dans la mémoire/tempdisk en premier. – BalusC

+1

@BalusC: Ce que je veux, c'est terminer le processus de téléchargement du client. Le mode Streaming recevra toujours le fichier entier avant de faire quoi que ce soit à ce sujet. C'est juste trop tard. – Jason

3

voici une solution de contournement fou: vous pouvez écrire (ou trouver quelque part) une application autonome pare-feu basée sur Sockets qui gère la requête HTTP, analyse les en-têtes et si la demande correspond à vos conditions personnalisées - pare-feu transmet à Tomcat Réponse d'erreur HTTP. Ou vous pouvez essayer de régler Apache < -> Tomcat avec quelques règles Apache.

4

Cela n'est pas possible avec les API standard. Et vous violez certaines normes de protocole/RFC si vous le faites. Alors pourquoi tu ferais ça? Au lieu de cela, envoyez une réponse "Connection: close" (en-tête http) sans corps http.

Questions connexes