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 :

File upload, problème de compréhension


Sujet :

Développement Web en Java

  1. #1
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut File upload, problème de compréhension
    Bonjour à tous!

    J'ai besoin d'aide pour mon travail de fin d'études.

    Pour l'application côté "serveur" (site de ventes en ligne) je dois télécharger des images correspondant aux articles en vente à partir de mon poste de travail vers... j'en sais pas trop car tout se passe sur localhost pour le moment.

    Après avoir lu des avis pour et contre vis à vis du stockage des bytea ou chemins de fichier varchar dans une base de données Postgres j'ai choisi la deuxième possibilité mais là je ne comprends pas comment ça fonctionne...

    Le composant "FileUpload" de PrimeFaces (version 3.1) semble fonctionner car JsfUtil me dit que le fichier a bien été uploadé (où ça?).

    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.print(fileName + " " + contentType + " "+ bytes.toString().substring(0, 10));
    m'affiche
    Infos: C:\Users\MCR\Pictures\Capture.PNG image/png [B@27ca87c
    alors je dirais que le fichier est bien là: pas null, pas vide.

    Qu'est-ce que je devrais en faire par la suite?

    Comme vous voyez, "fileName" correspond à qq chose du genre "C:\...\...", si j'ai bien compris ça ne peut pas marcher pour l'affichage sur une page xhtml car les "volumes" de type C, D ou autre ne sont pas pris en compte. Je devrais certainement faire un substring ou parse mais comment faire pour que ce soit générique tant pour "C:\" que pour "http://"?

    Créér un répértoire /imagesWebApp sous C:, lire le flux de données de l'image en question et l'écrire dans un autre flux de données qui me crée l'image dans ce répértoire-ci, stocker le chemin "/imagesWebApp/maNouvelleImage.formatImage" dans la DB? Et si jamais les images vont se trouver sur un serveur ("http://")?

    Ou ...?

    J'ai lu pas mal de sujets sur des applets, servlets et librairies Apache qui font ça (y compris http://javaweb.developpez.com/faq/ja...GEMENT_FICHIER)mais comme je travaille sur localhost et pas sur un serveur distant j'ai du mal à comprendre les histoires de DAO et openConnection(). Je suis connectée sur l'interface utilisateur avec les droits requis, j'ai l'image à ma disposition, que devrais-je faire?

    Merci de votre aide!
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  2. #2
    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
    filename, c'est le nom du fichier choisi par le browser, ca ne t'es d'aucune utilité. D'ailleurs beaucoup de navigateur ne donnent pas le chemin complemet mais juste la fin. Ce que tu dois faire c'est prendre les byte[] du fichier uploader ou l'inputstream, et copier le contenu du fichier vers un nouveau ficheir, que tu crée dans ton serveur tomcat, dans une répertoire que tu dédie à ce stockage. Ensuite il te faudra vraissemblablemet créer un servlet pour servir ces fichiers et il faudra stocker aussi ce dont tu as besoin dans ta base de données.

    Bref, tu dois bien faire la distinction entre ton serveur et ton client qui doivent être considéré comme des machines distrincte en production (sinon on vois pas l'intéret d'utiliser un serveur web )

  3. #3
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Bonjour, merci de votre réponse!

    Citation Envoyé par tchize_ Voir le message
    Bref, tu dois bien faire la distinction entre ton serveur et ton client qui doivent être considéré comme des machines distrincte en production (sinon on vois pas l'intéret d'utiliser un serveur web )
    C'est là mon problème...

    Jusqu'à présent on utilisait un sous-répértoire "images" du répértoire "Web Pages" de l'application, l'affichage sur la page web était quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:graphicImage width="80" value="/images/OriginalSize/#{basketLine.fkarticle.idarticle}.jpg" style="border:none"/>
    je peux continuer à utiliser le sous-répértoire en question, c'est à dire créér la nouvelle image là? Comme c'est une image par article, l'id de l'article pourrait servir d'idéntifiant pour l'image... Qu'est-ce qu'elle est censée faire la servlet?

    J'utilise NetBeans 7.1 et GlassFish 3.1.1, je viens de faire un tour rapide de la console d'administration sans avoir trouvé une façon de stocker un fichier sur le serveur.

    Merci de votre patience...
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  4. #4
    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
    la servlet c'est comme la jsp, quelque chose qui donne une réponse à une demande. Par défaut, le conteneur j2ee renverra le contenu des fichier statiques contenus dans le .war (tes fichiers image), mais un .war c'est théoriquement du lecture seule, donc pas le bon endroit pour stocker. Il faut donc créer une servlet qui, lorsqu'on lui demandera l'image du produit X ira dans ton dossier images uploadées, qui est externe au war, lire le contenu de l'image pour l'envoyer au client.

  5. #5
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Bonjour,

    J'ai probablement mal expliqué: ma question concerne l'utilisateur "gestionnaire". Je devrais pouvoir ajouter une photo au nouvel article créé ou mettre à jour une photo existante. Je clique sur un lien, je choisis la photo correspondante dans un dossier "Images" et je la télécharge vers un endroit quelconque.

    L'image doit être disponible à la consultation sur le site (ou sur ma page d'administration) immédiatement. Sur le site les articles en vente sont présentés dans une DataTable, sur chaque ligne il y a l'image du produit.

    Il n'est pas question qu'un autre utilisateur puisse télécharger cette image, dans ce stade-là le seul "client" est le navigateur web. Il y aura un téléchargement de tout l'objet article vers une application web "client" mais là il y aura un Web Service qui s'en occupera.

    Dans ce cas-ci il faut toujours utiliser une servlet? Si c'est le cas, comment faire? Créér une nouvelle servlet dans un nouveau package (ou dans le package .jsf?), écrire une méthode doGetImageArticle{}, déclarer la servlet dans le contrôleur de la classe Article et sur la page "detailArticle.xhtml" ou sur la colonne correspondant à l'image dans la table écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <p:graphicImage width="80" value="#{articleController.maServlet.getImage(currentArticle.cheminDeFichier)}.jpg" style="border:none"/>
    Navrée d'abuser de votre patience, merci!
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  6. #6
    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
    tu dois faire ceci:

    1) upload -> byte[] récupéré de l'upload -> stockage sur le disque dur en un endroit quelconque identifiable par l'id de l'article.
    2) graphicimage -> url pointant vert ta servlet cusotm, genre <p:graphicImage width="80" value="/imagesDynamiques/#{basketLine.fkarticle.idarticle}" style="border:none"/>
    3) servlet /imagesDynamique/* qui, à partir de l'id article retrouve le fichier uploadé sur le disque dur et le sert.

  7. #7
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    tu dois faire ceci:

    3) servlet /imagesDynamique/* qui, à partir de l'id article retrouve le fichier uploadé sur le disque dur et le sert.
    Je dois déclarer cette servlet dans Configuration Files -> glassfish-web.xml -> Add Servlet et l'ajouter dans le fichier web.xml (en plus de Faces Servlet)?
    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
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet>
             <servlet-name>Images Servlet</servlet-name>
             <servlet-class> ???</servlet-class>
             <load-on-startup> ???</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
            <servlet-mapping>
            <servlet-name>Images Servlet</servlet-name>
            <url-pattern>/imagesDynamiques/*</url-pattern>
        </servlet-mapping>
    Les paramètres servlet-class et load-on-startup sont les mêmes que pour Faces Servlet? Ou j'ai encore mal compris et ça ne marche pas comme ça?
    Si vous auriez un tutoriel à me conséiller, je suis vraiment désolée de vous ennuyer autant...

    Merci!
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  8. #8
    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
    Servlet-class c'est la classe que tu crée (ta servlet quoi). Bref faut coder un peu aussi quand même

  9. #9
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Bref faut coder un peu aussi quand même
    Ca je m'en doutais mais je voulais savoir un peu plus sur quoi et comment il faut faire. Pas trop envie de me lancer dans des modifications à l'aveugle car j'ai codé un peu jusqu'à présent et l'upload du fichier ce n'est qu'une des fonctionnalités de l'application.

    Merci de votre patience, j'ai fait une copie du projet et j'essaierai l'ajout de la servlet sur la copie pour ne pas gâcher 4 mois de développement par maladresse, je vous tiendrai au courant!
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  10. #10
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Bonjour,

    J'ai le plaisir de vous faire part de ma réussite (OUF!) concernant l'implémentation de l'upload des images (j'ai même fait le Web Service RESTfull avant, tellement j'en avais marre - mais ça c'est une autre histoire).

    J'ai utilisé le composant FileUpload (mode="simple") de PrimeFaces v3.3.1. Les images sont téléchargées vers un dossier du domain GlassFish (un serveur quoi...) le chemin absolu est sauvegardé dans la DB et l'image est "servie" par une méthode getImageStreamToDisplay(){}.

    Je n'ai pas eu besoin de créer une servlet supplémentaire, FacesServlet s'est débrouillée comme une grande.

    Merci tchize_ pour m'avoir indiqué le bon chemin à suivre!
    Je vais tout de suite cliquer sur le bouton "Résolu".
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Thread et files d'attente]Problème de compréhension
    Par kromartien dans le forum Général Python
    Réponses: 4
    Dernier message: 26/04/2008, 15h12
  2. [Upload] Problème d'upload :)
    Par manu_du_31 dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2004, 15h56
  3. [com applet-servlet][file upload] CharConversionException
    Par meufeu dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/08/2004, 12h03
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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