Précédent   Forum du club des développeurs et IT Pro > Java > Développement Web en Java > Servlets/JSP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/05/2011, 10h41   #1
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Par défaut Télécharger un fichier depuis mon serveur

Bonjour,

Je sais que le sujet a été traité sous tous ses angles mais je n'arrive pas à trouver ce qui m’intéresse.

Petite explication de mon application (en local):

Environnement de développement: NetBean 6.9.1
Serveur : glassfish 3.0.1
Pdf : itext 5.0.6

En cliquant sur un lien je créé un fichier pdf (il est stocké sur le serveur : D:\Program Files\glassfish-3.0.1\glassfish\domains\domain1)


J'aimerai que juste après l'avoir créé, la fenêtre de téléchargement du navigateur me propose de le télécharger.

Est-ce possible?
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 08h31   #2
DevServlet
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 760
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 760
Points : 3 554
Points : 3 554
T'as des tonnes de tuto à ce propos sur le net, reviens vers nous avec plutôt des questions plus précises.
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h06   #3
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Bonjour, je reviens avec des questions plus précise sur le sujet:

J'ai trouvé un code qui a l'air de faire ce que je veux sauf que je n'arrive pas a le tester, j'ai une erreur:

Voici le script:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
InputStream is = new FileInputStream("C:/wamp/www/formations/AttestationSitiv/Attestation_ALIANE_Souhila_15-10-03.pdf");
OutputStream os = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=Attestation_ALIANE_Souhila_15-10-03.pdf");
int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1) {
   os.write(buf, 0, count);
}
is.close();
os.close();
et voici l'erreur (elle vient de la ligne 3):

ATTENTION: StandardWrapperValve[GestionFormServlet]: PWC1406: Servlet.service() for servlet GestionFormServlet threw exception
java.lang.IllegalStateException: PWC3990: getWriter() has already been called for this response
at org.apache.catalina.connector.Response.getOutputStream(Response.java:676)
at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:205)


Je ne comprend pas pourquoi le "getWriter" est déjà utilisé, je ne l'ai pas utilisé avant.

Merci de votre aide
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h17   #4
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Quel est le code complet de la servlet comment l'invoques-tu ? Par URL ? Un dispatch ?
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h41   #5
DevServlet
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 760
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 760
Points : 3 554
Points : 3 554
Citation:
Envoyé par Spiritkill Voir le message
Bonjour, je reviens avec des questions plus précise sur le sujet:

J'ai trouvé un code qui a l'air de faire ce que je veux sauf que je n'arrive pas a le tester, j'ai une erreur:

Voici le script:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
InputStream is = new FileInputStream("C:/wamp/www/formations/AttestationSitiv/Attestation_ALIANE_Souhila_15-10-03.pdf");
OutputStream os = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=Attestation_ALIANE_Souhila_15-10-03.pdf");
int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1) {
   os.write(buf, 0, count);
}
is.close();
os.close();
et voici l'erreur (elle vient de la ligne 3):

ATTENTION: StandardWrapperValve[GestionFormServlet]: PWC1406: Servlet.service() for servlet GestionFormServlet threw exception
java.lang.IllegalStateException: PWC3990: getWriter() has already been called for this response
at org.apache.catalina.connector.Response.getOutputStream(Response.java:676)
at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:205)


Je ne comprend pas pourquoi le "getWriter" est déjà utilisé, je ne l'ai pas utilisé avant.

Merci de votre aide
Ah je connais cette erreur là, il faudrait quà la fin de ton bout de code , tu fasses un truc du genre :
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h01   #6
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Merci pour vos réponses.

DevServlet:
la fonction "setComplete" n'existe pas pour "response".


Nemek:
La servlet est assez énorme donc je vais pas la mettre compète.
Elle est appelée par "url" lors d'un clique sur un "select".
Puis je regarde les paramètres et je redirige vers la bonne fonction privée dans la servlet.
Voila un peu le cheminement.
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h16   #7
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Il ne te reste plus qu'à mettre un breakpoint sur la méthode getWriter.
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h42   #8
DevServlet
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 760
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 760
Points : 3 554
Points : 3 554
Citation:
Envoyé par Spiritkill Voir le message
Merci pour vos réponses.

DevServlet:
la fonction "setComplete" n'existe pas pour "response".


Nemek:
La servlet est assez énorme donc je vais pas la mettre compète.
Elle est appelée par "url" lors d'un clique sur un "select".
Puis je regarde les paramètres et je redirige vers la bonne fonction privée dans la servlet.
Voila un peu le cheminement.
Je ne me souviens plus exactement du nom, mais y'a complete quelque part parmi les méthodes de la classe dont est issue response. verifie bien
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h46   #9
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Est-ce que cela peut être à cause du "out"?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
public class GestionFormServlet extends HttpServlet {
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
              doThat(request, response);
} finally {
            out.close();
        }
    }
 
 
private void doThat(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
	if (request.getParameter("pdf") != null) {
			InputStream is = new FileInputStream("C:/wamp/www/formations/AttestationSitiv/Attestation_ALIANE_Souhila_15-10-03.pdf");
			OutputStream os = response.getOutputStream();
			response.setHeader("Content-Disposition", "attachment;filename=Attestation_ALIANE_Souhila_15-10-03.pdf");
			int count;
			byte buf[] = new byte[4096];
			while ((count = is.read(buf)) > -1) {
				os.write(buf, 0, count);
			}
			is.close();
			os.close();
	}
	getServletContext().getRequestDispatcher("...").forward(request, response);
    }
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h54   #10
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Bon ben c'était bien a cause du "out". je l'ai mis en commentaire pour l'instant et ça marche.

Merci pour votre aide.
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h18   #11
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
J'ai problème d'url, mais cela vient de moi:

j'ai un fichier dans le dossier "web/pdf/attestation" de mon application. J'arrive pas a trouver l'url pour récupérer le fichier dans ce dossier.
j'ai testé plusieurs url:

formation/web/pdf/attestation/attestation1.pdf
/formation/web/pdf/attestation/attestation1.pdf
http://localhost:8080/formation/pdf/...testation1.pdf
http://localhost:8080/formation/web/...testation1.pdf

Merci de votre aide encore une fois.
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h09   #12
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Au niveau de la request tu peux reconstruire l'URL soumise par le client.
Ca permet de construire une URL conforme.

Pour la première, l'URL doit être relative à l'URL de la page qui contient le lien. Par exemple pour la page "http://localhost:8080/application/index.html" le lien est "web/pdf/attestation/attestation1.pdf"

La deuxème devrait marcher normalement.
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h46   #13
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
j'ai pratiquement essayé toutes les combinaisons possibles.

Je vous donne mon arborescence au niveau du projet (NetBean)


et celle des fichiers sur mon disque dur


Merci pour votre aide
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h03   #14
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Dans ton projet il y a un dossier "web" mais la racine de ton application c'est pas le projet mais le répertoire "web"

URL relative avec chemin relatif "pdf/attestation/attestation1.pdf"

URL relative avec chemin absolu "/application/pdf/attestation/attestation1.pdf"

URL absolue "http://localhost:8080/application/pdf/attestation/attestation1.pdf"
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h29   #15
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Bonjour,
merci pour cette explication; j'ai testé les 3 mais aucunes ne fonctionnent. J'ai bien remplacé "application" par mon "context path" qui est "formation", mais je tombe toujours sur la même page:
Error 500
java.io.FileNotFoundException: http:\localhost:8080\formation\pdf\attestation\Attestation1.pdf (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)

Le fichier existe bien dans le dossier donc je pense que cela reste une erreur d'url.


Merci encore.
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h36   #16
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Euh... Qu'est-ce que tu essayes de faire au juste ?

Car l'URL ce n'est pas un chemin disque !


Tu veux récupérer le chemin sur le disque d'une ressource de ton application ?
Si c'est le cas il faut utiliser ServletContext.getRealPath
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h52   #17
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Ben en fait, je voudrais qu'un client, qui utilise mon application à distance, puisse télécharger le fichier pdf via sont navigateur, mais comme je travaille en local, je stock le fichiers pdf dans un dossier de mon application pour pouvoir utiliser une url relative afin de ne pas la changer dés que je mettrais mon application sur un serveur à part.

j'utilise ce bout de code dans ma servlet:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
                InputStream is = new FileInputStream("/formation/pdf/attestation/Attestation1.pdf");
                OutputStream os = response.getOutputStream();
                response.setHeader("Content-Disposition", "attachment;filename=Attestation1.pdf");
                int count;
                byte buf[] = new byte[4096];
                while ((count = is.read(buf)) > -1) {
                    os.write(buf, 0, count);
                }
                is.close();
                os.close();
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h58   #18
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
problème résolu, c'est bien avec getServletContext().getRealPath();

j'ai remplacé l'url actuel par:
Code :
1
2
 
getServletContext().getRealPath("pdf/attestation/Attestation1.pdf")
et ça fonctionne merci beaucoup.
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h48   #19
Spiritkill
Membre habitué
 
Homme Gael Moro
Ingénieur Informatique et Réseaux
Inscription : avril 2011
Messages : 188
Détails du profil
Informations personnelles :
Nom : Homme Gael Moro
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur Informatique et Réseaux
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 188
Points : 144
Points : 144
Re,

désolé j'ai juste un petit problème:

juste avant de télécharger le pdf je le créé et le stock dans getServletContext().getRealPath("pdf/attestation")
mais le problème c'est le path retourné est celui-ci:
c:\dossier\dossier\FormationApp\build\web\pdf\attestation\

il est dans le dossier "build", ce qui veux dire que le fichier est supprimé si on fait un "clean" alors que je voudrais qu'il soit conservé dans:
c:\dossier\dossier\FormationApp\web\pdf\attestation\

Y a t-il une solution?
Spiritkill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h08   #20
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 736
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 736
Points : 3 789
Points : 3 789
Oui utilises un fichier de propriété dans lequel tu mets le chemin vers lequel tu veux conserver le fichier.

La notion de "clean" est spécifique à ton environnement de développement. En déploiement ça n'existe pas.
Pour ton application le répertoire "c:\dossier\dossier\FormationApp\web\pdf\attestation\" n'existe pas ! C'est un répertoire projet, de développement.
Quand ton application sera installé, il n'y aura aucun répertoire de la sorte.

Il n'est pas propre de stocker un fichier dans l'application web, car n'importe quel bédouin peut taper l'URL et aller chercher le fichier.

Pourquoi stocker sous forme de fichier et ne pas générer le PDF en mémoire et l'envoyer ensuite ?
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h57.


 
 
 
 
Partenaires

Hébergement Web