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 08/01/2013, 04h39   #1
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
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 :
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)?
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 08h54   #2
olivier.pitton
Membre éprouvé
 
Avatar de olivier.pitton
 
Homme olivier pitton
Étudiant
Inscription : juin 2012
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme olivier pitton
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 210
Points : 439
Points : 439
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 :
1
2
 
<img src="upload/monimage.jpg" />
olivier.pitton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 17h15   #3
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
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
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 19h30   #4
olivier.pitton
Membre éprouvé
 
Avatar de olivier.pitton
 
Homme olivier pitton
Étudiant
Inscription : juin 2012
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme olivier pitton
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 210
Points : 439
Points : 439
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 :
1
2
 
<img src="upload/1.jpg" />
olivier.pitton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 05h58   #5
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
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.
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 10h20   #6
olivier.pitton
Membre éprouvé
 
Avatar de olivier.pitton
 
Homme olivier pitton
Étudiant
Inscription : juin 2012
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme olivier pitton
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 210
Points : 439
Points : 439
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.
olivier.pitton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h08   #7
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
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 :
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.
Citation:
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.
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 04h18   #8
olivier.pitton
Membre éprouvé
 
Avatar de olivier.pitton
 
Homme olivier pitton
Étudiant
Inscription : juin 2012
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme olivier pitton
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 210
Points : 439
Points : 439
Citation:
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.

Citation:
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/ ...

Citation:
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.
olivier.pitton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 21h54   #9
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
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
Citation:
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)
Citation:
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.
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 22h29   #10
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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 :
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 :
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
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 23h40   #11
SinDromX
Invité de passage
 
Inscription : mars 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 7
Points : 3
Points : 3
Merci tchize_!

Je n'y avais pas du tout pensé.

Je vais tester tout ça :-)
SinDromX est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h54.


 
 
 
 
Partenaires

Hébergement Web