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

Struts 1 Java Discussion :

[Struts 1] : afficher une image dans une jsp depuis un lecteur externe


Sujet :

Struts 1 Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2023
    Messages : 21
    Points : 8
    Points
    8
    Par défaut [Struts 1] : afficher une image dans une jsp depuis un lecteur externe
    Bonjour,

    Une petite question pour un petit problème que je n'arrive pas à résoudre :
    J'affiche une image dans une jsp ainsi, elle est dans le répertoire src/main/webApp/monRepertoire/images
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:img style="border:0px;" src="/monRepertoire/images/monImage.gif" />
    Sauf que maintenant, pour les besoin du projet, je dois la placer hors du projet sur le lecteur E ou un autre lecteur, donc la récupérer depuis le chemin absolue, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:img style="border:0px;" src="file:///E:/monImage.gif" />
    Mais l'image ne s'affiche pas !
    j'ai bien cherché sur le net, j'ai essayé par exemple avec la syntaxe file:///....

    D'avance merci pour votre aide

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Il n'est pas envisageable d'utiliser le scheme file:// pour ça.
    Il faut passer par une servlet (appelée par exemple servletImage) en lui passant un identifiant d'image (relatif au répertoire des images par exemple) et elle s'occupera de renvoyer le flux d'octets en retour via response.getOutputStream().
    Dans la page, on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    <img src="/application/servletImage?name=/repertoire/nomImage.png" .../>
    Ta servlet va récupérer la racine des images (le répertoire externe au serveur d'application) via une variable d'environnement ou un paramètre lié au conteneur de servlet, ajoutera la valeur du paramètre "name" (via request.getParameter("name")).
    Ensuite, tu n'as plus qu'à utiliser un FileInputStream pour lire le contenu de ton image et renvoyer le flux vers response.getOutputStream().
    Il faut préciser le contentType de la réponse, généralement on fait response.setContentType("image/png") <- là pour une image png, il faudra adapter en fonction du type d'image.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2023
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse.

    J'essaie avec ce que vous m'avez dit et ce que j'ai pu trouvé sur le net.

    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
     
    public void getImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
     
    	String imagePath = "E:\\img";
     
    	String requestedImage = request.getPathInfo();
     
    	File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));
     
    	String contentType = request.getServletContext().getMimeType(image.getName());
     
    	response.reset();
    	response.setContentType(contentType);
    	response.setHeader("Content-Length", String.valueOf(image.length()));
     
    	Files.copy(image.toPath(), response.getOutputStream());
    }
    Sauf que request.getPathInfo() est null !

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Ci-dessous des éléments de réponse :

    Classe utilitaire pour obtenir le content-type à partir d'un tableau de bytes
    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
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.net.URLConnection;
     
    public class ContentTypeUtils
    {
     
        /**
         * <h1>Recherche du content-type en fonction du contenu de l'image</h1>
         * @param imageBytes
         * @return Le content-type ou null
         * @author Olivier BUTTERLIN
         */
        public static String getContentType(byte[] imageBytes)
        {
            try
            {
                InputStream is = new BufferedInputStream(new ByteArrayInputStream(imageBytes));
                String mimeType = URLConnection.guessContentTypeFromStream(is);
                return mimeType;
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;
            }
        }
    }
    Pour lire l'image, il faut juste faire quelque chose comme ceci :
    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
    public static void main(String[] args)
    {
        String directoryPath = "d:/Temp/";
        String imagePath = "Jakarta_EE_logo.png";
        try
        ( FileInputStream is = new FileInputStream(directoryPath +  imagePath);)
        {
            byte[] bytes = is.readAllBytes();
            System.out.println("Taille de l'image : " + bytes.length + " octets");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2023
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Encore merci !

    Avec les éléments que vous m'avez donné, j'ai essayé ceci :

    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
     
    public ActionForward init(ActionMapping pMapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                throws Exception {
     
    	DynaValidatorForm dynaForm = (DynaValidatorForm) form;
     
    	getImage(request, response);
     
    	// ..
    	dynaForm.set("name", getName());
    	return pMapping.findForward("init");
    }
     
    private void getImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
    	String imagePath = "E:\\img\\";
    	String requestedImage = "monImage.gif";
    	File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));
     
    	if(!image.exists()){
    		response.sendError(HttpServletResponse.SC_NOT_FOUND);
    		return;
    	}
     
    	String contentType = request.getServletContext().getMimeType(image.getName());
    	response.reset();
    	response.setContentType(contentType);
    	response.setHeader("Content-Length", String.valueOf(image.length()));
    	Files.copy(image.toPath(), response.getOutputStream());
    }
    à la fin, j'ai mon image qui s'affiche !
    Mais elle prend toute la page ! aucun autre composant ne s'affiche !
    J'ai même vidé la jsp de tout code, l'image s'affiche quand même et prend toute la page !

    Si je fais pas appel à la méthode getImage(), ma jsp s'affiche normalement avec tous ses composants.

    Je pense qu'avec cette solution, il manque pas grand chose pour que tout fonctionne bien : la jsp avec ses composant et l'image dedans.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    J'imagine que tu as juste une balise <img src="..."/> dans ta page, du coup, comme aucune taille n'est spécifiée, la page rendra l'image à sa taille source.
    Il faudrait mettre une taille dans la balise <img/> avec l'attribut style.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="..." style="max-width: 200px; max-height: 200px"/>
    En utilisant max-width et max-height, on gardera la proportion de l'image source
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2023
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    J'imagine que tu as juste une balise <img src="..."/> dans ta page, du coup, comme aucune taille n'est spécifiée, la page rendra l'image à sa taille source.
    Il faudrait mettre une taille dans la balise <img/> avec l'attribut style.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="..." style="max-width: 200px; max-height: 200px"/>
    En utilisant max-width et max-height, on gardera la proportion de l'image source
    Ce n'est pas le dimensionnement de l'image. Même avec une jsp complètement vide avec zéro code, l'image s'affiche et prend toute la page !

    Je pense qu'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    response.reset();
    response.setContentType(contentType);
    response.setHeader("Content-Length", String.valueOf(image.length()));
    Le reset(), vide "response" et dans outputStream envoyé à la jsp on ne trouve que l'image. Peut être qu'il faut trouver un moyen pour ajouter (append) le flux de l'image sans faire le reset().

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    C'est clair que le reset() n'a pas sa place.
    Ceci dit, ce n'est pas logique d'utiliser une action struts pour récupérer une image, il faut passer par une servlet comme je te le suggérais plus haut.

    Tu peux montrer le code de ta page et accessoirement une image écran du résultat, je ne comprends pas ce que tu veux dire avec "l'image s'affiche et prend toute la page !"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2023
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Voici maintenant dans une 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
     
    @WebServlet("/image/*")
    public class ImageWriter extends HttpServlet {
        private static final long serialVersionUID = 1L;
        String imagePath = "E:\\img\\";
        String requestedImage = "monImage.gif";
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
     
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
            ServletContext sc = request.getServletContext();
     
            File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));
     
            if(!image.exists()){
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
     
            request.setAttribute("imageFileName", image.getName());
     
            String contentType = sc.getMimeType(image.getName());
            response.reset();
            response.setContentType(contentType);
            response.setHeader("Content-Length", String.valueOf(image.length()));
            Files.copy(image.toPath(), response.getOutputStream());
     
        }
     
    }
    L'action struts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public ActionForward init(ActionMapping pMapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                throws Exception {
     
    	DynaValidatorForm dynaForm = (DynaValidatorForm) form;
     
    	ImageWriter imageWriter = new ImageWriter();
    	imageWriter.doGet(request, response);
     
    	....
    	dynaForm.set("link", url);
    	return pMapping.findForward("init");
    }
    la jsp :
    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
     
    <bean:define id="imageFileName" name="imageFileName" />
     
    <html:form action="/myAction.do"  method="post">
     
    	<table>
    		<tr>
    			....
    		</tr>
     
    		<tr>
    			<td>				
    				<html:img alt="${imageFilename}" src="${pageContext.request.contextPath}/image/${imageFilename}" />				
    			</td>
    		</tr>
    	</table>
     
    </html:form>
    Le rendu (le même, même si la jsp est complètement vide) :
    Nom : dev.PNG
Affichages : 42
Taille : 808,7 Ko

Discussions similaires

  1. Afficher ue image dans une page jsp appartir d'un ficher xml
    Par Mohcine.nb dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 19/05/2014, 10h59
  2. Impossible d'afficher les images dans ma JSP
    Par momjunior dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 27/01/2014, 16h09
  3. [Débutant] comment afficher plusieurs images dans une seule interface ?
    Par youssa81 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 06/02/2009, 00h36
  4. afficher des images dans une table
    Par battit64 dans le forum ASP.NET
    Réponses: 17
    Dernier message: 25/04/2008, 00h06
  5. afficher des images dans une listebox
    Par soforan dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 07/04/2008, 19h11

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