2010-06-03 5 views
1

Je suis nouveau et juste en développement sur J2EE. Je suis en train de modifier une application existante (un projet OpenSource). Je dois enregistrer une image sur un client envoyé par le serveur, mais je ne sais pas comment. Cette activité doit être effectuée de manière transparente sans affecter le fonctionnement existant de l'application.Servlet envoyer l'image du serveur et enregistrer dans le client

À partir des tests effectués, j'obtiens cette erreur: java.lang.IllegalStateException: getWriter() a déjà été appelé pour cette réponse.

Comment devrait effectuer cette tâche, selon votre propre opinion? Comment sauvegarder sur le client, localement, l'image?

Mise à jour:

Merci pour les réponses. Mon problème est que:

  1. l'image est générée sur le serveur, mais pas pour la demande du client directe (il n'y a pas de lien à cliquer sur la page Web), l'image est composée en utilisant d'autres services sur Internet.
  2. reconstruire l'image sur le serveur.
  3. Cette image doit être envoyée au client pour être enregistrée localement.
  4. donc je voudrais qu'il apparaisse une fenêtre où vous affectez l'image de destination
  5. plus J'aimerais que le reste de l'application ne soit pas affecté par cette activité.
  6. L'application est encore en production.

Merci beaucoup pour votre réponse.

Répondre

2

From the tests done I get this error: java.lang.IllegalStateException: getWriter() has Already Been Called for this response.

En d'autres termes, vous essayiez de mélanger les données binaires de l'image avec les données de caractères de la sortie HTML, ou que vous essayez de le faire dans une JSP au lieu d'un Servlet. Cela ne va en effet pas fonctionner. Vous devez envoyer soit l'image ou la page HTML exclusivement en réponse à demandes entièrement séparées.

Dans votre page JSP/HTML ont juste un lien vers l'image, comme ceci:

<a href="imageservlet/filename.gif">click to download image</a> 

Puis, dans un servlet écoute sur un url-pattern de /imageservlet/*, vous obtenez juste l'image que InputStream de certains datasource (par exemple à partir du système de fichiers du disque local sous la forme FileInputStream), puis écrivez-le dans le OutputStream de la réponse à la manière habituelle des E/S Java.

Vous ne devez définir au moins l'en-tête de réponse Content-Disposition à attachment pour vous assurer que le client obtenir un Enregistrer sous dialogue pop-up, sinon il sera affiché directement dans le navigateur. Les paramètres Content-Type et sont également importants pour que le navigateur sache ce que le serveur envoie et puisse prédire la durée du téléchargement.

response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); 
response.setHeader("Content-Length", String.valueOf(file.length())); 
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\""); 

Vous trouverez par exemple de servlet de base complète dans this article.

Remarque: vous ne pouvez pas contrôler où le client enregistrerait l'image, ce serait un trou de sécurité. De cette façon, les sites Web seraient capables d'écrire des fichiers malveillants sur le disque du client.


Mise à jour: selon votre mise à jour, il y a deux options:

  1. Vous devez laisser le client se feu deux requêtes HTTP (j'ai répondu ceci dans your subsequent question)

  2. Créez une application côté client qui effectue toute la tâche directement du côté client, puis l'incorpore dans votre page Web, par exemple un Java Applet. Avec une applet, vous avez un contrôle total sur l'environnement client. Vous pouvez exécuter presque tout le code Java que vous souhaitez exécuter et vous pouvez écrire des fichiers directement sur le disque sans demander au client l'emplacement à enregistrer. Vous devez seulement signer l'applet par une société tierce ou le client doit confirmer un avertissement de sécurité avant de l'exécuter.

1

C'est au navigateur de savoir comment tous les types de sortie sont gérés. Les pages Web reçoivent un type de contenu html que le navigateur comprend et finit par afficher une page que nous pouvons voir. Les images reçoivent le type de contenu de l'image/jpeg qui est rendu comme images quand dans une page etc. Pour forcer une invite de téléchargement, il faut utiliser un type de contenu d'un fichier binaire plutôt que celui d'une image. que montre l'image. Pour assurer cette utilisation quelque chose comme "application/octetstream" ... je ne peux pas rappeler exactement, mais c'est facile à google pour.

Questions connexes