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

Glassfish et Payara Java Discussion :

Comment uploader des fichiers sur le serveur


Sujet :

Glassfish et Payara Java

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut Comment uploader des fichiers sur le serveur
    Bonjour,

    Je suis en train de réaliser une application qui permet de stocker ses fichiers audios sur un serveur et d'y avoir accès depuis le web.

    Le problème c'est que je ne sais pas comment m'y prendre pour stocker des fichiers sur le serveur.
    J'ai essayé :
    Les fichiers étaient stocké dans :
    glassfish4\glassfish\domains\domain1\config

    Et je ne pense pas qu'ils étaient accessible depuis le web.

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getServletContext().getRealPath("/Dossier");
    Les fichiers étaient stocké dans WebContent, ils étaient donc accessible depuis le web.
    Le problème c'est qu'à chaque redémarrage tout était effacé.

    Connaissez-vous la solution pour stocker des fichiers en utilisant Glassfish ?
    Je pourrai les transformer en byte[] et les stocker en BLOB sur la base de données, mais ce n'est pas optimal.

    D'avance merci.
    Au revoir.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    tu défini dans ton projet un dossier, à part de glassfish, où tu stockera tes fichiers. Et tu crée un servlet pour servir lesdits fichiers. Rien de bien sorciers. Mais tout est à faire, il n'y a pas de truc déjà prêt pour faire serveur de fichier dans une conteneur J2EE.

  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 842
    Points
    7 842
    Par défaut
    Bonjour,

    Pour nuancer un peu la réponse de Monsieur tchize_: créez un dossier "AppUploadedFiles" sous le répertoire glassfish4\glassfish\domains\domain1\config puis essayez d'adapter la méthode suivante (qui dans mon cas téléchargeait des images d'articles) à vos besoins (téléchargement de fichiers audio) :
    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
     
    public void upload() throws IOException {
            InputStream is;
            String fileName = uploadedFile.getFileName();
            String dir = "AppUploadedFiles\\";
     
            try {
                File tempFile = new File(dir + getArticleController().getCurrent().getIdarticle() + ".png");
                is = uploadedFile.getInputstream();
                OutputStream os = new FileOutputStream(tempFile);
     
                byte buf[] = new byte[1024];
                int len;
                while ((len = is.read(buf)) > 0) {
                    os.write(buf, 0, len);
                }
                os.close();
                is.close();
     
                getArticleController().getCurrent().setPath(tempFile.getAbsolutePath());
                getArticleController().getEjbFacade().edit(getArticleController().getCurrent());
     
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            String name = fileName.substring(fileName.lastIndexOf("\\") + 1);
            JsfUtil.addSuccessMessage(name + " is uploaded.");
        }
    Pour les BLOB dans la base des données je vous l'accorde: c'est pas optimal du tout. En plus, si jamais vous utilisez une base de données PostgreSQL: la récupération d'un objet binaire est un vrai casse-tête...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Cette méthode est dangereuse. Pour ce que je lit, elle suppose que le répertoire courant, au démarrage de glassfish, est le répertoire domain1\config.
    Je ne suis pas expert en glassfish, mais je doute que ce soit garantit par glassfish. Cela dépend entièrement de la manière dont glassfish est démarré. Sans compter que le répertoire config n'est peut être pas le plus adapté pour ce genre de stockage.

    Bref, mettez le chemin COMPLET. Ensuite si je suggère de le mettre en dehors de glassfish, c'est pour qu'il ne disparaisse pas à la mise à jour de glassfish

    Le code serait au minimum à adapter comme ceci.

    sous windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     String dir = "d:/myAppName/AppUploadedFiles";
    sous linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     String dir = "/var/locale/myAppName/AppUploadedFiles";
    L'idéal étant de garder cela comme une option de configuration.

  5. #5
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Merci pour vos réponses.

    Mais si je défini un dossier local par rapport au serveur (c'est mal dit), est-ce qu'il est possible de donner un lien pour télécharger le fichier ?

    Quoi qu'au pire je peux copier le fichier dans le dossier WebContent si je veux proposer à un utilisateur de télécharger le fichier.

    Et sinon ce serait réalisable en JMS ?

  6. #6
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Comme quoi faut lire le forum, j'ai posé le même genre de question que toi quelques heures après.

    Pour jms, je ne sais pas. Mais pour le telechargement, je compte perso faire une méthode avec un retour de type File et le nom du fichier en paramètre. Il suffit de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new File (cheminDuDossier+nom);
    Comme ça pas d'accès direct au disque dur du serveur par l'utilisateur.

  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 842
    Points
    7 842
    Par défaut
    Citation Envoyé par tchize_ Voir le message

    Bref, mettez le chemin COMPLET. Ensuite si je suggère de le mettre en dehors de glassfish, c'est pour qu'il ne disparaisse pas à la mise à jour de glassfish

    Le code serait au minimum à adapter comme ceci.

    sous windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     String dir = "d:/myAppName/AppUploadedFiles";
    sous linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     String dir = "/var/locale/myAppName/AppUploadedFiles";
    L'idéal étant de garder cela comme une option de configuration.
    Merci pour ces précisions Monsieur!

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par thierrybenji Voir le message
    est-ce qu'il est possible de donner un lien pour télécharger le fichier ?
    Tu fais exactement comme si tu avais mis le fichier dans un Base de données. Tu l'a stocké dans un endroit a priori inaccessible à l'utilisateur, tu dois donc créer un servlet qui sert ce fichier. Je ne vois pas ce que JMS viens dans l'histoire

    La servlet ne fera que quelque ligne, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    response.setContentType("application/octet-stream");
    File f = trouverFichier(id);
    InputStream is = new FileInputStream(f);
    IOUtils.copy(is,response.getOutputStream())
    Avec un peu de nettoyage à rejouter autour pour bien tout fermer

  9. #9
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Merci.

    Par contre le seul IOUtils que je peux importer c'est : sun.misc.IOUtils.
    Et il ne propose pas copy.

    Est-ce qu'il faut que j'importe un autre .jar ?
    Pour l'instant je n'inclus que :
    glassfish4\glassfish\lib\gf-client.jar

    C'est un jar d'Appache ?
    Ça peut marcher avec :
    glassfish4\glassfish\lib\install\applications\__admingui\WEB-INF\extra\commons-io-1.3.1.jar

    http://commons.apache.org/proper/com...utputStream%29
    C'est juste copier l'InputStream dans l'OutputStream ?

    D'habitude dans les doGet et doPost d'habitude je fais des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    response.sendRedirect(request.getContextPath()+"/index.jsp?erreur=identification");
    // Ou :
    request.getRequestDispatcher("/servlet/userAccount").forward(request, response);
    J'ai pas encore essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    response.setContentType("application/octet-stream");
    response.getOutputStream();
    Mais je pense avoir compris merci.
    Je vais essayer.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    IOUtils est fournis par commons io de apache. Ca tévite d'avoir à écrire une boucle de 5 à 6 lignes pour transférer d'un inputstream vers un outputstream

    http://commons.apache.org/proper/com...ownload_io.cgi

  11. #11
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Merci.

    J'ai du ajouter le .jar dans :
    glassfish4\glassfish\domains\domain1\lib\ext

    Puis redémarrer le Server.
    Et maintenant je peux utiliser IOUtils d'Apache, c'est pas la première fois que je trouve des méthodes utile dans ce package, mais je ne l'avais encore jamais essayé.

    Ça fonctionne également en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    OutputStream out = response.getOutputStream();
    int nextChar;
    while (( nextChar = is.read()) != -1){
         out.write(nextChar);
    }
    out.flush();

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par thierrybenji Voir le message
    Merci.

    J'ai du ajouter le .jar dans :
    glassfish4\glassfish\domains\domain1\lib\ext
    PAN!

    C'est dans le WEB_INF/lib que tu met les jar utilisé par ta webapp. Là tu altère à gros risque le fonctionnement de glassfish en lui ajoutant des librairies.

  13. #13
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Merci.

    C'est plus pratique comme ça.
    J'avais essayé de mettre dans WEB-INF/extra mais ça ne fonctionnait pas.

  14. #14
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Les fichiers que j'upload son des fichiers audio.

    Pour l'instant quand je clique sur un lien j'ai un stream d'octet, donc soit un téléchargement, soit une lecture audio selon le navigateur.

    Est-ce qu'il possible de mettre un lecteur audio HTML5, où quand je cliquerai sur le bouton play la chanson se lancera ?

  15. #15
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 820
    Points : 18 740
    Points
    18 740
    Par défaut
    Ok alors pour avoir la taille et le nom du fichier, dans la servlet il faut ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    response.setContentLength((int) file.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
    Pour avoir le lecteur audio HTML5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <audio src="music.ogg" controls="controls">
    Sauf qu'à la place de music.ogg il faut mettre le lien de la servlet, pour moi ça fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getContextPath()+"/servlet/download?id="+c.getId()
    C'était beaucoup plus simple que prévu.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/10/2011, 22h43
  2. Uploader des fichiers sur un serveur
    Par diabli73 dans le forum Général Java
    Réponses: 7
    Dernier message: 14/09/2010, 17h41
  3. Réponses: 1
    Dernier message: 28/01/2009, 12h58
  4. Réponses: 14
    Dernier message: 14/03/2007, 19h32
  5. [Strategie] Accéder à des fichiers sur un serveur
    Par elan dans le forum Général Java
    Réponses: 4
    Dernier message: 28/09/2005, 18h30

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