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

Servlets/JSP Java Discussion :

Affichage d'images uploadées


Sujet :

Servlets/JSP Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Affichage d'images uploadées
    Bonjour à tous,

    J'ai quelques bases de développement en Java et je voudrais réaliser un petit site web bidon, histoire de me faire la main.
    Sur ce site web, j'ai besoin d'uploader des images, puis de les afficher, et c'est là que ça coince!

    Pour l'upload, pas de problème, j'utilise un bout de code trouvé sur le net adapté à mes besoins:
    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
    @WebServlet(name = "index", urlPatterns = {"/"})
    @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 1,
    location = "c:/temp",
    maxFileSize = 1024 * 1024 * 500,
    maxRequestSize = 1024 * 1024 * 500)
    public class Index extends HttpServlet {
     
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getRequestDispatcher("/form.jsp").forward(req, resp);
        }
     
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            for (Part part : req.getParts()) {
                String fileName = extractFileName(part);
                part.write(fileName);
            }
            resp.sendRedirect(getServletContext().getContextPath() + "/");
        }
     
        private String extractFileName(Part part) {
            String contentDisp = part.getHeader("content-disposition");
            String[] items = contentDisp.split(";");
            for (String s : items) {
                if (s.trim().startsWith("filename")) {
                    return s.substring(s.indexOf("=") + 2, s.length() - 1);
                }
            }
            return "";
        }
    Aucune gestion d'erreur, il s'agit là juste de faire un petit essai.

    Tout ça fonctionne à la perfection. J'ai d'ailleurs été rudement heureux de découvrir cette fonction dans les JSP 3, par rapport à la gestion des flux avec les librairies apache fileupload.

    Je voudrais ensuite afficher l'image que je viens d'uploader, mais j'ignore comment faire.
    Dans quel dossier dois-je la placer pour qu'elle soit accessible par mon serveur web (Glassfish pour le moment)?

  2. #2
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Une fois que tu as uploadé l'image, si tu l'écris sur le disque, elle sera accessible à l'endroit où tu as écris le fichier, et sera bel et bien dans le "contexte" de Tomcat.

    Tu peux, par exemple, créer un dossier upload/ et y mettre toutes les images. Il te suffira alors d'aller chercher l'image spécifié dans le dossier en utilisant simplement la balise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="upload/monimage.jpg" />

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour Olivier et merci pour ta réponse.

    J'ai un peu de mal à assimiler tout ça, j'ai un peu plus d'expérience avec PHP et Apache, qui n'ont pas l'air de fonctionner de la même façon.

    Pour mon test, j'écris mes images dans le dossier c:\temp (Windows). Ce dossier doit être créé à l'avance sinon j'ai une belle erreur de filenotfound.
    De même, si je ne spécifie pas un chemin complet tel que ci dessus, j'ai la même erreur.

    Une fois mes images envoyées, quel source devrais-je indiquer pour les afficher?
    Imaginons un fichier nommé 1.jgp

  4. #4
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Plop,

    La source doit être : <répertoire>/1.jpg

    Le problème vient du "contexte" de ton serveur. Peut-il lire C:/temp ? (à priori oui) Et est-ce que le client peut y accéder ? (à priori non).

    Tout comme dans n'importe quel langage serveur, tu enregistres les fichiers uploadés, de préférence, dans un endroit accessible à tous. Par exemple tes css sont généralement dans css/ car le client doit pouvoir y accéder.

    Donc le client doit pouvoir accéder à tes images, en passant par le serveur.

    Le mieux serait de créer directement un répertoire upload/ (au démarrage ou de manière permanente) et lors d'un upload, tu écris dans upload/<nom_fichier>.

    Si on reprend ton exemple, si le client veut uploader 1.jpg, tu vas écrire le fichier dans upload/ (donc son chemin sera upload/1.jpg). Enfin tu affiches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="upload/1.jpg" />

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ok, je pense que mon principal ne vient pas de mon upload en lui même mais de mon manque d'expérience sur Glassfish (et non pas Tomcat comme je l'avais indiqué plus haut, corrigé depuis).

    J'utilise le déploiement standard de Glassfish qui est installé automatiquement par Netbeans, du coup je n'ai pas mis les mains dans le cambouis de ce côté là et j'ignore comment se comporte réellement la bête. Contrairement à PHP & Apache que j'ai pas mal pratiqué et que je connais.

    Le dossier c:/temp où j'effectue mes uploads est à priori accessible par le serveur, puisque mes uploads fonctionnent et mes fichiers sont bien créés dans ce dossier.

    Avec PHP, je faisais généralement mes uploads dans un dossier /upload se trouvant à la racine de mon script/application.
    Les fichiers envoyés étaient donc facilement accessibles par les clients puisque dans le même contexte que le script.
    J'ai plus de mal avec Java/Glassfish, car j'ignore où se trouvent les fichiers de mon application une fois déployée sur Glassfish et je ne connais pas bien l'arborescence de tout le tralala.

  6. #6
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Que tu sois sur GlassFish ou Apache ne change rien pour ce genre de choses. Chaque serveur a un répertoire courant, dans lequel tu accèdes via ".".

    Que tu saches où tes images sont n'est pas le problème, il faut simplement que le serveur sache où les chercher. C'est pour cela que je te conseille de simplement créer un répertoire upload et d'y mettre tes images.

    Une possibilité serait de chercher manuellement le répertoire de GlassFish en utilisant "." et de créer un fichier qui pointe directement dans ton contexte (la où est déployé ta webapp). Mais cela rend le code non portable et dépendant du serveur.

    Mais que cela soit GlassFish ou Apache, ça revient au-même.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    J'ai fait quelques tests déjà là dessus, mais je coince toujours.

    Dans mon doPost, j'ai ajouté ce code qui crée un dossier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    File dossierUpload = new File("/temp/");
    if (!dossierUpload.exists()) {
    dossierUpload.mkdir();
    }
    Le dossier est créé à la racine de mon disque dur "c:\temp".

    J'ai modifié l'annotation Multipartconfig de mon servlet pour que la location soit "/temp".

    Mais lors de l'upload, j'ai une erreur.
    L'écriture du fichier se fait dans le fichier suivant, mais comme le sous dossier temp dans lequel il essaie d'écrire n'existe pas, j'ai une erreur.
    C:\Users\Guillaume\AppData\Roaming\NetBeans\7.2.1\config\GF3\domain1\generated\jsp\TestUpload\temp\upload__17c3943f_13c20c27147__7ff4_00000001.tmp
    Comment créer ce dossier au bon endroit? Je ne comprends pas.
    Dois-je créer un dossier vide dans Netbeans? Où?
    Dois-je le créer via un bout de code dans mon programme? Mais à ce moment quel emplacement spécifier?

    Je sèche.

  8. #8
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Comment créer ce dossier au bon endroit? Je ne comprends pas.
    Crée un dossier qui sera embarqué avec ton application et déployé sur le serveur.

    Dois-je créer un dossier vide dans Netbeans? Où?
    Ai nuveau de ton WEB-INF, afin qu'il soit déployé avec le reste de l'application. Un répertoire au même niveau que tes dossiers css/ WEB-INF/ ...

    Dois-je le créer via un bout de code dans mon programme? Mais à ce moment quel emplacement spécifier?
    Dans ta Servlet, spécifie que tu veux écrire dans "upload/" ou "./upload/" qui se trouve normalement dans le répertoire courant du processus, et non à la racine de l'OS.

    Le but du jeu est d'uploader tes images dans ton application, et non quelque part sur ton système, afin que les utilisateurs puissent les requêter comme ils peuvent requêter un fichier JS de ton application.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Désolé pour l'absence de réponse, j'ai été occupé ces derniers temps.

    J'ai testé ce que tu me dis, mais ça ne fonctionne toujours pas.

    Voici un screen de l'arborescence de mon projet dans Netbeans, j'ai créé à la fois un uploads dans mon projet web à la racine, et un dans WEB-INF pour être certain.


    J'ai modifier l'annotation Multipartconfig pour essayer l'upload dans les dossiers uploads, /uploads et ./uploads
    Voici les résultats :
    ./uploads
    java.io.FileNotFoundException: C:\Users\Guillaume\AppData\Roaming\NetBeans\7.2.1\config\GF3\domain1\generated\jsp\TestUpload\.\uploads\2012-12-15.11.44.01.vnt (Le chemin d?accès spécifié est introuvable)
    Le sous dossier . n'existe pas dans l'arborescence

    /uploads ou uploads (même résultat)
    java.io.FileNotFoundException: C:\Users\Guillaume\AppData\Roaming\NetBeans\7.2.1\config\GF3\domain1\generated\jsp\TestUpload\uploads\2012-12-15.11.44.01.vnt (Le chemin d?accès spécifié est introuvable)
    Là encore uploads n'existe pas

    Dans tous les cas, j'ai essayé d'aller voir ce qui se trouvait dans le dossier où l'upload tente de se faire, le dossier TestUpload existe, mais ensuite plus rien, le dossiers upload n'existe pas.

    A noter que si je spécifie "" à la place de "uploads" dans l'annotation Multipartconfig, l'upload fonctionne, mon fichier est bien envoyé, mais je n'arrive pas à y accéder via un navigateur.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par olivier.pitton Voir le message
    Le mieux serait de créer directement un répertoire upload/ (au démarrage ou de manière permanente) et lors d'un upload, tu écris dans upload/<nom_fichier>.

    Si on reprend ton exemple, si le client veut uploader 1.jpg, tu vas écrire le fichier dans upload/ (donc son chemin sera upload/1.jpg). Enfin tu affiches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="upload/1.jpg" />
    Non, c'est la pire idée, on n'écrit jamais dans le contexte de l'application. En effet, ce contexte est détruit à chaque redéploiement. Sur un serveur comme JBOSS, ca veux dire que tu perd tes upload à chaque redémarrage de jboss!!


    Tu dois créer un dossier, à l'extérieur de ton application, imaginons qu'on l'appelle c:\upload et tu y met les fichier.

    Ensuite tu crée un servlet, que tu mappe sur /upload/* et qui va lire ce dossier, avec un code du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File storage = new File("c:\\upload");
    File document = new File(storage,request.getPathInfo());
    IOUtils.write(new FileInputStream(document),response.getOutputStream());
    Sans oublier les headers, les vérifications de sécurité, etc

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci tchize_!

    Je n'y avais pas du tout pensé.

    Je vais tester tout ça :-)

Discussions similaires

  1. [WB12] Image Uploadée dans BDD et affichage
    Par kalimero95 dans le forum WebDev
    Réponses: 11
    Dernier message: 25/08/2014, 11h50
  2. [1.x] probléme d'affichages des images uploadés
    Par sou1987 dans le forum Symfony
    Réponses: 4
    Dernier message: 27/04/2010, 10h22
  3. [MySQL] Upload et affichage d'images
    Par fredericsonnet dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/05/2009, 10h46
  4. [Upload] affichage d'image uploadée
    Par bernard26000 dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2007, 18h17
  5. [Upload]utilitaire de gestion de site web: affichage d'image
    Par CR_Gio dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 02/04/2006, 01h57

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