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 02/01/2013, 15h16   #1
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
Par défaut Parcourir, charger et sauvegarder une image dans une BDD

Bonjour

J'aimerais savoir comment sauvegarder une image dans une base de données mysql avec J2EE,et ensuite pouvoir l'afficher.En effet j'aimerais faire un truc comme lorsqu'on charge ajoute une nouvelle photo sur sa page facebook, c'est à dire :
  1. Parcourir l'image sur le disque dur
  2. Charger l'image sur le site web
  3. Sauvegarder l'image dans la base de données

Je ne sais vraiment pas par où commencer;Donc j'attends impatiemment votre aide.

Merci
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 15h54   #2
olivier.pitton
Membre éprouvé
 
Avatar de olivier.pitton
 
Homme olivier pitton
Étudiant
Inscription : juin 2012
Messages : 213
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 : 213
Points : 444
Points : 444
Plop,

Citation:
Parcourir l'image sur le disque dur
Tu peux utiliser un input de type file te permettant de parcourir les fichiers sur le pc du client.

Documentation ici.

Citation:
Charger l'image sur le site web
Côté serveur, tu ajoutes une Servlet (ou quelque chose capable d'intercepter des requêtes HTTP de type POST) et tu récupères le contenu du fichier. Le plus simple pour cela est d'utiliser cette bibliothèque : apache-commons-fileupload

Citation:
Sauvegarder l'image dans la base de données
Enfin, pour stocker purement l'image, tu peux utiliser la structure BLOB de MySQL. Tu peux, par exemple, créer une table contenant le nom d'une image, l'utilisateur propriétaire et le blob.

Pour l'affichage, il te suffit de récupérer toutes les images de l'utilisateur désirant voir ses photos, par exemple, en utilisant le champ utilisateur propriétaire que j'ai décris précédemment.

Bon courage !
olivier.pitton est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 11h43   #3
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
Ok merci,je vais exploiter cette piste.Je te tiens au courant
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 12h18   #4
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
J'ai parcouru les liens que tu m'as envoyés et je dois avouer que c'est un peu chaud pour moi ., surtout pour le chargement de l'image sur le site web.Il y'a quelques zones d'ombres notamment ce bout de code:

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
 
           try {
            // Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
 
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
    FileItemStream item = iter.next();
    String name = item.getFieldName();
    InputStream stream = item.openStream();
    if (item.isFormField()) {
        String name = item.getFieldName();
    String value = item.getString();
 
 
    } else {
        String fieldName = item.getFieldName();
    String fileName = item.getName();
    String contentType = item.getContentType();
    boolean isInMemory = item.isInMemory();
    long sizeInBytes = item.getSize();
    }
}
 
 
        }
Si j'ai bien compris après avoir utilisé le "input file" pour chercher le fichier sur le disque dur, je peux utiliser ce code pour récupérer le fichier qui se trouve dans le champ de texte.Maintenant ce que je n'arrive pas à comprendre:

1.Dans ce bout de code:
Code :
boolean isMultipart = ServletFileUpload.isMultipartContent(request)
Qu'est ce que je suis censé mettre dans "request"?

2.Pourquoi certaines class ne sont pas reconnues par mon netbeans?Parce qu'en plus mon netbeans ne me propose pas d'importer les class pour corriger ces erreurs.Il s'agit de:
Citation:
ServletFileUpload; FileItemIterator; FileItemStream;
3.Comment le code ci-dessus arrive à récupérer les détails du fichier sans qu'il n y ait un lien entre le champ de texte et le code.C'est à dire qu'il faudrait par exemple insérer le nom du "input file" dans le code ci-dessus.

Encore merci
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 14h11   #5
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
Finalement je sais pourquoi mes class ne sont pas reconnues.JE devais les créer moi-même ().Mais heureusement que ces class sont téléchargeables sur le lien que tu m'as donné.Cependant la Class FileCleaningTracker n'est pas incluse dans le package que j'ai téléchargé.Donc la solution est de la rechercher et de la créer moi même.Mais le problème qui se pose, quand je crée la class, il y a toujours une nouvelle Class ou une méthode qui n'est pas reconnue.Donc je dois la rechercher et la créer.Ainsi de suite.Donc je me retrouve chaque fois à créer de nouvelles class.Donc mis à part le package que j'ai téléchargé,j'ai créé une dizaine class et j'ai toujours de nouvelles erreurs.

Donc j'aimerais savoir si je dois continuer à les créer moi même ou bien y aurait-il un autre package que j'ai oublié de télécharger.

Je dois aussi rappeler que j'ai ajouté le jar "commons-fileupload-1.2.2.jar" dans mon application.

Merci
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2013, 15h20   #6
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
J'ai trouvé,il fallait tout simplement que je crée une nouvelle librairie pour l'ajout du "commons-fileupload-1.2.2.jar".
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2013, 22h11   #7
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 412
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 412
Points : 33 154
Points : 33 154
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
En jEE6, il existe des annotations sur la servelt pour que ce soit le conteneur qui gère le multipart directement, plus besoin de commons fileupload.
__________________
⥀⥁ Чиз 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 30/01/2013, 16h10   #8
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
Je me suis basé sur le code suivant pour insérer une image dans la BD mysql:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
 
 
import java.io.*;
	import java.sql.*;
	import java.util.*;
	import java.util.regex.*;
	import org.apache.commons.fileupload.servlet.ServletFileUpload;
	import org.apache.commons.fileupload.disk.DiskFileItemFactory;
	import org.apache.commons.fileupload.*;
	import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
	import javax.servlet.http.*;
 
          @WebServlet(name="Test2", urlPatterns={"/Test2"})
	public class Test2 extends HttpServlet {
     Connection con;
	    @Override
	    public void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        PrintWriter out = response.getWriter();
	        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
	        System.out.println("request: " + request);
	        if (!isMultipart) {
	            System.out.println("File Not Uploaded");
	        } else {
	            FileItemFactory factory = new DiskFileItemFactory();
	            ServletFileUpload upload = new ServletFileUpload(factory);
	            List items = null;
 
	            try {
	                items = upload.parseRequest(request);
	                System.out.println("items: " + items);
	            } catch (FileUploadException e) {
	                e.printStackTrace();
	            }
	            Iterator itr = items.iterator();
	            while (itr.hasNext()) {
	                FileItem item = (FileItem) itr.next();
	                if (item.isFormField()) {
	                    String name = item.getFieldName();
	                    System.out.println("name: " + name);
	                    String value = item.getString();
	                    System.out.println("value: " + value);
	                } else {
	                    try {
	                        String itemName = item.getName();
	                        Random generator = new Random();
	                        int r = Math.abs(generator.nextInt());
 
	                        String reg = "[.*]";
	                        String replacingtext = "";
	                        System.out.println("Text before replacing is:-"
	                                + itemName);
	                        Pattern pattern = Pattern.compile(reg);
	                        Matcher matcher = pattern.matcher(itemName);
	                        StringBuffer buffer = new StringBuffer();
 
	                        while (matcher.find()) {
	                            matcher.appendReplacement(buffer, replacingtext);
	                        }
	                        int IndexOf = itemName.indexOf(".");
	                        String domainName = itemName.substring(IndexOf);
	                        System.out.println("domainName: " + domainName);
 
	                        String finalimage = buffer.toString() + "_" + r
	                                + domainName;
	                        System.out.println("Final Image===" + finalimage);
 
	                        File savedFile = new File(
	                                "C:/UploadedFiles"
	                                        + "images\\" + finalimage);
	                        item.write(savedFile);
	                        out.println("<html>");
	                        out.println("<body>");
	                        out.println("<table><tr><td>");
	                        out.println("<img src=images/" + finalimage + ">");
	                        out.println("</td></tr></table>");
 
 
 
	                        String strQuery = null;
	                        String strQuery1 = null;
	                        String imgLen = "";
 
	                        try {
	                            System.out.println("itemName::::: " + itemName);
 
	                             Class.forName("com.mysql.jdbc.Driver");
 
	                           con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbTetris","root","passer");
	                            Statement st = con.createStatement();
	                            strQuery = "insert into testimage values image='"
	                                    + finalimage + "'";
 
	                            int rs = st.executeUpdate(strQuery);
	                            System.out
	                                    .println("Query Executed Successfully++++++++++++++");
	                            out.println("image inserted successfully");
	                            out.println("</body>");
	                            out.println("</html>");
	                        } catch (Exception e) {
	                            System.out.println(e.getMessage());
	                        } finally {
	                            con.close();
	                        }
	                    } catch (Exception e) {
	                        e.printStackTrace();
	                    }
	                }
	            }
	        }
	    }
	}
Le problème est que j'ai ce message d'erreur:
Citation:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'image='img_1752170504.jpg'' at line 1
Voici la structure de ma table:

Code :
1
2
3
4
5
CREATE TABLE testimage(
ID INTEGER AUTO_INCREMENT,
image BLOB,
PRIMARY KEY (ID)
);
Merci
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2013, 16h15   #9
andry.aime
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 6 588
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 6 588
Points : 10 380
Points : 10 380
Bonjour,

Pourquoi ne pas uploader seulement l'image dans un répertoire spécifique et sauvegarder l'url de l'image dans la base? C'est beaucoup plus performant.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2013, 10h15   #10
momjunior
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 121
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 121
Points : 34
Points : 34
Envoyer un message via MSN à momjunior Envoyer un message via Yahoo à momjunior
Ok je vois.Mais comment
  1. sauvegarder l'URL dans la base de données
  2. Faire le lien entre l'image et l'url lors de l'affichage

Merci beaucoup
momjunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2013, 11h28   #11
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 412
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 412
Points : 33 154
Points : 33 154
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
1) tu va te faciliter franchement la tâche en laissant le conteneur gérer l'upload

exemple ici http://java-brew.blogspot.be/2011/03...ervlet-30.html
Je cite:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.jb;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
 
@MultipartConfig
@WebServlet(name="FileUploadServlet", urlPatterns={"/FileUploadServlet"})
public class FileUploadServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doPost(request, response);
    } 
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
 
        System.out.println("do post of file upload...");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Part part = request.getPart("fileName");
        InputStream is = part.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        FileWriter fw = new FileWriter("c:/temp/tmp.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        String line = null;
        while((line = br.readLine())!=null){
        bw.write(line);
        bw.newLine();
        }
        bw.close();
        br.close();
        out.write("File Uploaded successfully...");
        out.close();
    }
}
2) il faut que tu te renseigne un peu sur le SQL parce que ta requête ne ressemble à rien -> ouvrir un cours à ce sujet.

3) en général, l'opération peux se faire de deux manière:
a) tu stocke l'image dans la base de données (un blob) et tu la récupère dans une servlet dédiée à servir l'image
b) tu stocke l'image dans un dossier quelconque, tu stocke dans la DB le chemin vers l'image, et tu la récupère dans une servlet dédiée à servir l'image.
__________________
⥀⥁ Чиз 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
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h37.


 
 
 
 
Partenaires

Hébergement Web