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 :

Récupération d'un champ BLOB et téléchargement/affichage dans JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut Récupération d'un champ BLOB et téléchargement/affichage dans JSP
    Bonjour à tous,

    Dans ma Web App, j'ai créé et stocké un fichier xls dans ma base de données dans un champ blob.

    Je souhaite maintenant que d'un click, l'utilisateur puisse récupérer ce fichier.
    J'arrive à extraire le blob, et à lire les bits pour obtenir mon fichier xls original, mais comment faire pour "l'afficher" dans ma jsp ?

    Voici mon code :

    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
     
    sql="SELECT nom_fichier_xls, fichier_xls  FROM budget WHERE id_budget=?";
    		try{
    			cnx=Connexion.open();
    			cmd=cnx.prepareStatement(sql);
    			cmd.setInt(1, id_budget);
    			result=cmd.executeQuery();
    			if(result.first()){
    				result.first();
    				nomFichier=result.getString("nom_fichier_xls");
    				InputStream iStreamFile = result.getBinaryStream("fichier_xls");
     
    				byte [] buffer=new byte[1024];
    				int length=0;
    				while((length=iStreamFile.read(buffer))!=-1){
    					oStreamFile.write(buffer,0,length);
    				}
    			}
    			else{
    				System.out.println("Pas d'occurences trouvees");
    			}

    Je souhaiterais soit pouvoir l'ouvrir dans un nouvel onglet, soit pouvoir afficher la boite de dialogue de firefox (Ouvrir avec / Enregistrer sous).

    Comment puis-je procéder à partir de ma servlet ?

  2. #2
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Bonjour,

    Bon, j'ai essayé pas mal de méthodes, en essayant de renvoyer par exemple le flux OutputStream pour pouvoir le faire lire par la servlet. Mais rien de mieux.

    Quelqu'un sait-il comment je peux me dépatouiller ?

  3. #3
    Membre chevronné Avatar de florentB
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Par défaut
    A quel résultat es-tu actuellement ?

    Que t'affiches la page ?

    Quel est ton code actuel ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Merci de ton intéret Florent,

    Pour l'instant, j'ai mis le problème de côté, ne sachant du tout par où l'attaquer (mais ça ne m'enlève pas l'envie de le résoudre !)

    Comme écrit dans mon premier post, j'ai essayé, à partir de la servlet, de récupérer le fichier généré et de l'afficher (ou dialog box ouvrir/enregistrer).
    Mais lorsque j'utilise cette méthode, je ne peux renvoyer l'objet avec un out.println(), car en retour, j'ai uniquement l'url du fichier.

    J'ai donc testé une deuxième technique : essayer de récupérer un tableau de bytes et le faire lire de façon séquentielle par la servlet. Mais pour cette technique, je ne sais trop comment m'y prendre.

    Enfin, j'ai aussi essayé de récupérer, dans ma méthode principale, un flux OutputStream pour l'envoyer en lecture séquentielle à la servlet, mais là encore, je ne sais pas du tout comment procéder.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Pleaaaaaaaase Help

    Personne n'a une idée, une piste à explorer ?

  6. #6
    Membre chevronné Avatar de florentB
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Par défaut
    jette un oeil ici, je pense que ça doit aller pour ce que tu veux faire :
    tu récupère la response, puis tu lui écrit ce qu'il faut dedans.
    N'oublies pas de mettre le bon content-type pour les fichier xls


    == Edit
    Le code est à faire dans les servlets

  7. #7
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Salut à tous,

    J'ai donc expérimenté la solution passé en lien.
    Résultat :
    - 1 - J'arrive a récupérer mon objet Blob dans ma base de donnée
    - 2 - Je definit le contentType comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment; filename=test.xls");
    J'ai également fait un test en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentType("application/octet-stream");
    Mais lorsque j'exécute mon code, j'arrive bien à la boucle qui transfère le flux dans le tableaux de byte, mais rien ne se passe au niveau de mon navigateur.
    Toutefois, je sens que le fichier "n'est pas loin" car dans le résultat de ma requête POST, dans firebug, j'obtient bien un fichier binaire en réponse (concaténation de caracteres impossibles à déchiffrer).

    Savez vous ce qui pourrait me faire bloquer comme ça ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Analyste/programmeur Java
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/programmeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Par défaut
    Hello,

    fais-tu ceci ?

    Dans ta page web : <a href="TonServlet?fileId=123">télécharger fichier</a>

    Dans ton servlet (je colle le code d'un servlet que j'ai écrit et qui fait ça, à part que c'est n'importe quel fichier, pas spécialement xls) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    doGet(...){
      ......
      resp.setContentType(mediaContent.getMimeType());
      // ça tu le fais déjà avec "application/vnd.ms-excel" ce qui me semble correct
      resp.setHeader("Content-disposition","attachment; filename=\""+fileName+"\"");
      // ça aussi tu fais déjà comme il faut semble-t-il
      ServletOutputStream out = resp.getOutputStream();
      out.write(mediaContent.getContentAsByteArray());
      // est-ce que tu fais ça ? (note : la méthode renvoie un byte[])
      out.flush(); 
      // et ceci ?
    }
    Works like a charm
    En espérant t'avoir aidé, sinon fais signe en mettant tout le code actuel de ton servlet, on devrait y arriver sans soucis

    Niilzon

    Edit : Aaah j'ai peut-être vu ton erreur : il manque des guillemets autour du fileName que tu mets dans le header. J'ai jamais essayé sans guillemets, c'est peut-être bien la cause de ton soucis

  9. #9
    Membre averti
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Merci à tous, j'ai réussi à me dépatouiller de tout ça !

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

Discussions similaires

  1. Récupération d'un champ BLOB et téléchargement/affichage
    Par roadyrod dans le forum Général Java
    Réponses: 2
    Dernier message: 19/09/2011, 17h34
  2. Réponses: 12
    Dernier message: 12/04/2010, 17h27
  3. Réponses: 0
    Dernier message: 14/05/2009, 12h38
  4. [JFreeChart] Affichage dans JSP
    Par Jips dans le forum 2D
    Réponses: 4
    Dernier message: 28/03/2008, 10h08
  5. Réponses: 1
    Dernier message: 12/05/2007, 10h26

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