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

GWT et Vaadin Java Discussion :

Problème de chemin d'images


Sujet :

GWT et Vaadin Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Février 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 46
    Par défaut Problème de chemin d'images
    Bonjour à tous,

    Je génère des rapport Jasper Report dans un projet GWT.

    Lorsque j’exécute l'application depuis Eclipse en mode DEV, la version HTML du rapport Jasper Report affiche bien mes images.

    En mode PROD, je déploie l'application dans un TOMCAT et dans cet environnement tout simple, les images n'apparaissent plus.
    En cherchant, je me rend compte que les images ne sont plus générer à la racine du dossier de déploiement du projet mais à la racine de TOMCAT.

    J'ai cru comprendre que le serveur embarquer dans le SDK de GWT n'est pas un TOMCAT. Le problème vient-il de cette différence ?

    Quelques ligne de code pour illustrer tout cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR_NAME, "./images/jasper_tmp/");
          exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images/jasper_tmp/");
    Depuis Eclipse les images générées sont dans :
    /MON_PROJET/war/images/jasper_tmp

    Après déploiement dans TOMCAT, les images se retrouvent générées dans :
    C:\Program Files\Apache Software Foundation\Tomcat 7.0\images\jasper_tmp
    Alors que IMAGES_URI pointerait plutôt sur c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MON_PROJET\images\jasper_tmp

    J'ai bien l'impression qu'aucune URI ne peut accéder à un dossier autre que les sous-dossiers de c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\.

    La question :

    Pourriez-vous m'indiquez s'il est possible de régler ce problème sans passer par un serveur Apache HTTP ? Si oui, comment devrai-je procéder ?


    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de karbos
    Inscrit en
    Novembre 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 155
    Par défaut
    Citation Envoyé par lnplnp Voir le message
    Après déploiement dans TOMCAT, les images se retrouvent générées dans :
    C:\Program Files\Apache Software Foundation\Tomcat 7.0\images\jasper_tmp
    Alors que IMAGES_URI pointerait plutôt sur c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MON_PROJET\images\jasper_tmp
    Je ne comprends pas pourquoi ta Webapp se déploie de cette manière. Tu as bien un fichier war que tu places dans le dossier Webapps ?
    Citation Envoyé par lnplnp Voir le message
    J'ai bien l'impression qu'aucune URI ne peut accéder à un dossier autre que les sous-dossiers de c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\.
    Effectivement le dossier Webapps symbolise la racine des applications. Aucune ressource publique ne devrait être accessible ailleurs dans le serveur...
    Citation Envoyé par lnplnp Voir le message
    La question :
    Pourriez-vous m'indiquez s'il est possible de régler ce problème sans passer par un serveur Apache HTTP ? Si oui, comment devrai-je procéder ?
    Comprends pas la question

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Février 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 46
    Par défaut
    Citation Envoyé par karbos Voir le message
    Je ne comprends pas pourquoi ta Webapp se déploie de cette manière. Tu as bien un fichier war que tu places dans le dossier Webapps ?
    Le fichier Mon_Projet.war est dans le dossier "c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\Mon_Projet.war". C'est bien là qu'il faut le mettre ? Je pense que oui puisque, même lorsque l'on passe par l'outil web tomcat admin, le war est posé dans ce dossier.

    Une précision supplémentaire pour te permettre de comprendre :
    Le dossier image/jasper_tmp n'est pas dans le fichier WAR. Il est créé au moment du premier appel de la servlet. Malheureusement, quand je déploie l'application dans TOMCAT et suite au premier appel de la même servlet, ce dossier est créé dans %TOMCAT_HOME% et non dans webapp/%PROJET%/images/jasper_tmp.

    Citation Envoyé par karbos Voir le message
    Effectivement le dossier Webapps symbolise la racine des applications. Aucune ressource publique ne devrait être accessible ailleurs dans le serveur...

    Comprends pas la question
    On pourrait faire en sorte que le dossier "C:\Program Files\Apache Software Foundation\Tomcat 7.0\images\jasper_tmp" soit accessible grâce à Apache HTTP et une rewrite rule. Mais j'aimerai si cela est possible éviter d'installer Apache HTTP et n'utiliser que TOMCAT.

    D'après l'article http://zekey.developpez.com/tutoriel/apache/tomcat/, installer Apache HTTP permet d'avoir de meilleure performance mais je n'en ai pas vraiment besoin pour cette application MON_PROJET.
    Je sais qu'avec Apache, il est possible de rendre un dossier accessible où qu'il soit grâce à une rewriterule.

  4. #4
    Membre expérimenté
    Avatar de karbos
    Inscrit en
    Novembre 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 155
    Par défaut
    ALors il y a deux trucs différent dans ton topic :

    1) Chemin relatif à la servlet :
    Citation Envoyé par lnplnp Voir le message
    Le dossier image/jasper_tmp n'est pas dans le fichier WAR. Il est créé au moment du premier appel de la servlet. Malheureusement, quand je déploie l'application dans TOMCAT et suite au premier appel de la même servlet, ce dossier est créé dans %TOMCAT_HOME% et non dans webapp/%PROJET%/images/jasper_tmp.
    C'est bizare que la servlet ait pu écrire à la racine de Tomcat. Tu as le code de cette servlet ? Où se trouve-t-elle physiquement ?

    2) Droit d'accès aux fichiers :
    Citation Envoyé par lnplnp Voir le message
    On pourrait faire en sorte que le dossier "C:\Program Files\Apache Software Foundation\Tomcat 7.0\images\jasper_tmp" soit accessible grâce à Apache HTTP et une rewrite rule. Mais j'aimerai si cela est possible éviter d'installer Apache HTTP et n'utiliser que TOMCAT.
    Sinon, est-ce que tu as regardé le fichier conf/catalina.policy ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Février 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 46
    Par défaut
    Il est possible que cette discussion n'ait pas sa place ici. Dommage que l'on ne puisse pas mettre une même discussion dans plusieurs "forums" et peut-être qu'un système de tag serait plus approprié. Je me rend compte que malgré le fait que tout cela se passe dans mon projet GWT, le problème concerne soit Jasper Report et / ou TOMCAT.

    Bref ! J'ai pour l'instant "abandonné" la résolution de ce problème... je dois produire quelques choses à montrer au client :o)

    Dans ce projet, je génère le même rapport Jasper Report dans trois format différents : HTML, PDF et MS Excel.
    Bizarrement il n'y a que la version PDF qui réponde vraiment à mes attentes. Peut-être ma méconnaissance de Jasper Report et de TOMCAT conjuguée fait que je vais abandonner le rapport HTML et Excel pour l'instant le temps de faire du propre avec ce qui me semble le plus facile à mettre en place.

    Je continuerai à suivre cette discussion pour savoir si soit je peux apporter une précision à la résolution du problème soit trouver une solution qui peut convenir. Dans ce but, je poste la servlet ci-dessous (en espérant que cela réponde à ta question d'ailleurs) :

    Le web.xml correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      <servlet>
        <servlet-name>jasperServlet</servlet-name>
        <servlet-class>fr.mon.projet.server.JasperServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>jasperServlet</servlet-name>
        <url-pattern>/mon_projet/jasperServlet</url-pattern>
      </servlet-mapping>
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    public class JasperServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        log.info("[JasperServlet] ");
        try {
          String format = null;
          String jasperFilename = null;
          String database = null;
          JasperReport jasperReport = null;
          // paramètres à envoyer au rapport
          Map<String, Object> parameters = new HashMap<String, Object>();
     
          Enumeration<?> en = request.getParameterNames();
          while (en.hasMoreElements()) {
            String parameterName = (String) en.nextElement();
            if (parameterName.equals("format")) {
              format = request.getParameter(parameterName);
            } else if (parameterName.equals("jasperFilename")) {
              jasperFilename = request.getParameter(parameterName);
            } else if (parameterName.equals("jdbcURI")) {
              database = request.getParameter("jdbcURI");
              if (database != null) {
                if (database.length() == 0) {
                  database = null;
                }
              }
            } else {
              if (request.getParameter(parameterName).equals("null")) {
                parameters.put(parameterName, "%");
              } else {
                parameters.put(parameterName, request.getParameter(parameterName));
              }
              log.info("[JasperServlet] [Param:" + parameterName + "]=" + request.getParameter(parameterName));
            }
          }
     
          String realPath = getServletContext().getRealPath("/");
          jasperFilename = realPath + jasperFilename;
     
          log.info("[JasperServlet] jasperFilename=" + jasperFilename);
     
          if (jasperFilename.toLowerCase().endsWith(".jrxml")) {
            JasperDesign jasperDesign = null;
            try {
              FileInputStream in = new FileInputStream(jasperFilename);
              jasperDesign = JRXmlLoader.load(in);
            } catch (Exception e) {
              e.printStackTrace();
            }
            if (jasperDesign == null) {
              log.error("jasperDesign load failled");
              return;
            }
            jasperReport = JasperCompileManager.compileReport(jasperDesign);
     
          }
     
          Database db = null;
          if (database == null) {
            db = new Database(log, databaseUrl, databaseName, databaseLogin, databasePassword, logDebug, false);
          } else {
            db = new Database(log, database, logDebug, false);
          }
          if (db.sqlConnect()) {
            Connection connection = db.getConnection();
            JasperPrint jasperPrint = null;
     
            if (jasperReport == null) {
              log.info("[JasperServlet] jasperFilename=" + jasperFilename);
              FileInputStream in = new FileInputStream(jasperFilename);
              jasperPrint = JasperFillManager.fillReport(in, parameters, connection);
            } else {
              jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
            }
     
            JRExporter exporter = getExporter(format, response);
            ServletOutputStream outStream = response.getOutputStream();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);
            exporter.exportReport();
            outStream.flush();
            outStream.close();
          } else {
            ServletOutputStream outStream = response.getOutputStream();
            PrintWriter pw = new PrintWriter(outStream);
            pw.write("<html>");
            pw.write("<h1>SQL Connect problem:</h1>");
            pw.write("<hr />");
            pw.write(db.getErrorMessage());
            pw.write("</html>");
            pw.flush();
            pw.close();
            outStream.flush();
            outStream.close();
          }
     
          log.info("[JasperServlet] job done");
        } catch (Exception e) {
          e.printStackTrace();
          log.error("[JasperServlet] exception:" + e.toString());
          ServletOutputStream outStream = response.getOutputStream();
          PrintWriter pw = new PrintWriter(outStream);
          pw.write("<html>");
          pw.write("<h1>" + e.toString() + "</h1>");
          pw.write("<hr />");
          e.printStackTrace(pw);
          pw.write("</html>");
          pw.flush();
          pw.close();
          outStream.flush();
          outStream.close();
     
        }
      }
     
      public JRExporter getExporter(String format, HttpServletResponse response) {
        JRExporter exporter = null;
     
        if (format.equalsIgnoreCase("html")) {
          exporter = new JRHtmlExporter();
          exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.TRUE);
          exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR_NAME, "./images/jasper_tmp/");
          exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images/jasper_tmp/");
          exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
          exporter.setParameter(JRHtmlExporterParameter.OUTPUT_FILE_NAME, "report.html");
          response.setHeader("Content-Disposition", "inline;filename=rapport.html");
          response.setContentType("text/html");
        } else if (format.equalsIgnoreCase("xls")) {
          exporter = new JRXlsExporter();
          exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
          exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
          exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
          exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
          exporter.setParameter(JRHtmlExporterParameter.OUTPUT_FILE_NAME, "report.xls");
          response.setContentType("application/vnd.ms-excel");
          response.setHeader("Content-Disposition", "inline;filename=rapport.xls");
        } else if (format.equalsIgnoreCase("pdf")) {
          exporter = new JRPdfExporter();
          exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
          exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
          exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
          exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
          exporter.setParameter(JRHtmlExporterParameter.OUTPUT_FILE_NAME, "report.pdf");
          response.setHeader("Content-Disposition", "inline;filename=rapport.pdf");
          response.setContentType("application/pdf");
        }
     
        return exporter;
      }
    }

  6. #6
    Membre expérimenté
    Avatar de karbos
    Inscrit en
    Novembre 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 155
    Par défaut
    Lignes 36-37 de ton post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String realPath = getServletContext().getRealPath("/");
          jasperFilename = realPath + jasperFilename;
    Est-ce que c'est toi qui a écrit ça ? Tu peux le modifier ?
    C'est effectivement une adresse qui pointe vers la racine du serveur en prod et vers la racine du projet Eclipse en Dev...
    A mon avis tu devrais plutôt avoir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String realPath = getServletContext().getContextPath();
    Cela va désigner la racine de ta Webapp...

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Février 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 46
    Par défaut
    Citation Envoyé par karbos Voir le message
    Lignes 36-37 de ton post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String realPath = getServletContext().getRealPath("/");
          jasperFilename = realPath + jasperFilename;
    Est-ce que c'est toi qui a écrit ça ? Tu peux le modifier ?
    C'est effectivement une adresse qui pointe vers la racine du serveur en prod et vers la racine du projet Eclipse en Dev...
    A mon avis tu devrais plutôt avoir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String realPath = getServletContext().getContextPath();
    Cela va désigner la racine de ta Webapp...
    Citation Envoyé par karbos Voir le message
    Est-ce que c'est toi qui a écrit ça ?
    Non... je récupère un projet en fait.
    Citation Envoyé par karbos Voir le message
    Tu peux le modifier ?
    Oui ! Je l'ai modifié et cela n'a pas réglé le problème.

Discussions similaires

  1. Problème de chemin sur image
    Par gladio62 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 10/01/2010, 02h45
  2. [Joomla!] Problème avec le chemin des images
    Par m1ro77 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 20/05/2009, 10h22
  3. accès à une image : problème de chemin d'accès
    Par canary dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 29/05/2008, 10h47
  4. [MySQL] Problème pour afficher une image dont le chemin est stocké dans la bdd
    Par cel.Saint-Louis dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2007, 08h49
  5. Réponses: 1
    Dernier message: 25/07/2007, 09h21

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