IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Accéder à des fichiers externes (PDF, doc) dans une application J2EE


Sujet :

Développement Web en Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Accéder à des fichiers externes (PDF, doc) dans une application J2EE
    Bonjour,

    je développe actuellement une application en java/J2EE sous eclipse ganymede avec le plugin WTP et le serveur d'application Tomcat 5.5

    Je souhaite afficher dans une page JSP un tableau avec une liste de PDF que je récupère depuis un répertoire et que j'ouvre grâce à un lien hypertexte

    Dans un premier temps j'utilise une classe DAO pour aller lire dans le répertoire et alimenter une collection d'objets qui porteront le nom du fichier, la version,...etc

    Voici la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public class ConsignesDAO
    {
     
    	List consignesList = null;
     
        public void loadConsignes(Person person) throws monAppliException
     
        {
     
        	File dir = new File("/tmp/pdf/consignes");
        	consignesList = new ArrayList();
        	try {
    			consignesDirectory(dir);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		person.setConsignesList(consignesList);
     
        }
     
     
        private void consignesDirectory(File dir)
        throws IOException {
     
    	    File[] files = dir.listFiles();
     
    	    Consigne c=null;
     
    		for (int i = 0; i < files.length; i++) {
    	      File f = files[i];
    	      if (f.isDirectory()) {
    	    	  consignesDirectory(f);  // recursivité
    	      } else if ((f.getName().endsWith(".pdf"))) {
     
     
    			try {
    				c = buildConsigne(f.getName());
    			} catch (monAppliException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    	  consignesList.add(c);
     
    	      }
    	    }
     
        }
     
    	private Consigne buildConsigne(String name)
        throws monAppliException	{
    		try
    		{
     
    		    return new Consigne(name, name, name);
    		}
    		catch (Exception e)
    		{
    		    e.printStackTrace();
    		    throw new monAppliException("erreur dans le parcours du PDF");
    		}
     
    	}
     
    }

    Dans un deuxième temps j'affiche les PDF dans ma JSP avec un lien hypertext vers le fichier physique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ....
    <jsp:useBean id="person" scope="session" type="com.monappli.model.Person" />
    ....
     
    <table id="myTable" cellpadding="0" cellpadding="0">
    					  	<thead>
     
    							<th axis="string"><fmt:message key="REFERENCE_LB" /></th>
     
    						</thead>
     
     
    						<tbody>
    						    <% 
    							List consignesList = person.getConsignes();
    							Iterator consignesIte = consignesList.iterator();
    							int i=0;
    							while (consignesIte.hasNext()) {
    								Consigne consigne = (Consigne) consignesIte.next();
    								i++;
    							%>
    						    <tr id="<%= consigne.getReference()%>" >
    						    	<td><a href="resources/pdf/consignes/<%= consigne.getReference()%>"><%= consigne.getReference()%></a></td>
    						    </tr>
    						    <%
    							}
    							%>
    					  </tbody>
     
    				  </table>


    Voici donc mon problème : Actuellement j'ai 2 répertoires pour gérer les mêmes PDF
    Dans la classe DAO je lis les PDF dans /tmp/pdf/consignes (en partant de la racine du disque dur)
    Et dans ma page JSP je lis les PDF dans resources/pdf/consignes/ qui correspond à un répertoire du contexte de mon application.

    Pourquoi 2 répertoires ? Et bien je n'arrive pas à accèder au répertoire resources/pdf/consignes/ depuis ma classe DAO et inversement depuis ma page JSP je n'arrive pas à lire dans /tmp/pdf/consignes.
    Comme ma classe DAO n'hérite pas de httpServlet je ne peux pas utiliser la méthode getServletContext() pour accéder au classpath de mon application

    L'idéal serait d'avoir un répertoire unique dans ma webapp

    Comment résoudre mon problème ?
    Quelles sont donc les meilleures méthodes pour accéder à des ressources externes dans un environnement J2EE tout en conservant une application suffisamment portable ?

    Merci

  2. #2
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Personnelement je préfère ne jamais faire de lien directe vers une ressource static comme un PDF ou fichier Word. J'utilise toujours une JSP pour traiter cela (ce qui me permet de placer l'ensemble des fichier en dehors de ma webapp et de en pas avoir de problème d'accès au répertoires en question (sauf que l'utilisateur faisant tourner le serveur d'appli doit pouvoir y accéder).

    en partant du principe que "file" en le chemin d'acces a ce fichier un simple copyStream marche très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.apache.commons.net.io.Util.copyStream(new java.io.FileInputStream(file), response.getOutputStream()) ;
    je peux ainsi gérer les droits d'acces a ces fichiers au niveau de mon appli et rendre transparent les répertoires .
    - Informaticien passionné
    - ( java, c++, cobol, php, asp, ... )
    - http://www.berthou.com/fr/

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Effectivement je m'y suis pris à peu près de cette manière à part que je ne connaissais pas la méthode copyStream du package commons Net (http://commons.apache.org/downloads/download_net.cgi)

    Dans ma jsp j'ai codé de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <%  List consignesList = null;
     
    consignesList = person.getConsignes();
     
    Iterator consignesIte = consignesList.iterator();
     
    String commonLink = request.getContextPath() + "/traiterPDF?type_fiche=" + FicheEnum.CONSIGNE + "&id_pdf=";
    String link;
     
    int i=0;
    while (consignesIte.hasNext()) {
    	Consigne consigne = (Consigne) consignesIte.next();
    	i++;
    	link = commonLink + consigne.getNomFichier();
    %>
       <tr id="type_fiche=<%=FicheEnum.CONSIGNE%>&id_pdf=<%= consigne.getNomFichier()%>" >
         	<td style="width: 130px;" ><a href="<%=link %>"><%= consigne.getReference()%></a></td>
      	<td><a href="<%=link %>"><%= consigne.getCategorie() %></a></td>
      	<td><a href="<%=link %>"><%= consigne.getConstructeur() %></a></td>
      	<td><a href="<%=link %>"><%= consigne.getTypeMateriel() %></a></td>
      	<td><a href="<%=link %>"><%= consigne.getTitre() %></a></td>					    	
      </tr>
      <%
    }
    %>
    et dans ma servlet je gère le flux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
     
    // Récupération de l'ID PDF passé en paramètre
    String idPDF = req.getParameter("id_pdf");
     
    File fileToRead = new File(pdfPath+ "/" + nameWithoutExtension + ".pdf");
     
    				if (fileToRead.exists()) {
    		        try {
    		            FileInputStream in = new FileInputStream(fileToRead);
    		            OutputStream s_out = resp.getOutputStream();
     
     
    		            resp.setContentType( "application/pdf" );
    		            resp.setContentLength((int)fileToRead.length());
    		            resp.addHeader("Content-disposition", "attachment; filename=" + fileToRead.getName());
    		            resp.setHeader("Cache-Control", "no-cache");
     
    		            int read;
    		            byte[] bytes = new byte[1024];
    		            while ((read = in.read(bytes, 0, bytes.length)) != -1) {
    		                s_out.write(bytes, 0, read);
    		            }
     
    		            in.close();
    		            s_out.flush();
    		            s_out.close();
    		        }
    		        catch (FileNotFoundException e) {
    		            e.printStackTrace();
    		        } catch (IOException e) {
    		            e.printStackTrace();
    		        }
    Ca marche très bien.

    Par contre pour connaitre le répertoire de ma webapp depuis mes objets java j'instancie une variable dans un service dès la connexion de l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Script dans TraiterLoginServlet :
     
    // Factory permettant de récupérer le service manager de l'application
    IService myService = ServiceFactory.getService();
     
    // On envoi le contextpath au service de l'application
    myService.setContextPath(this.getServletContext().getRealPath("/"));
    De cette manière je peux consulter les répertoires de ma webapp dès que j'en ai besoin en appelant la méthode getContextPath de mon service

    Merci pour la réponse.

Discussions similaires

  1. Enregistrer des fichiers word, pdf, etc. dans une base de données
    Par mallsoul dans le forum Décisions SGBD
    Réponses: 23
    Dernier message: 10/09/2014, 16h48
  2. Réponses: 1
    Dernier message: 04/10/2011, 14h05
  3. Accéder à des fichiers externes dans une appli J2EE
    Par endbegins dans le forum Développement Web en Java
    Réponses: 8
    Dernier message: 31/03/2011, 15h01
  4. Xemacs - ouvrir des fichiers depuis l'exporateur dans une même frame
    Par GhostNemo dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 07/05/2007, 01h50
  5. Mettre des fichier de type *.doc dans une variable
    Par Macandre dans le forum VBScript
    Réponses: 1
    Dernier message: 28/02/2007, 19h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo