2013-05-20 5 views
0

Je fais un site assez basique pour ma mère, et vu que j'ai fait quelques trucs en Java EE et avec EJB pendant le semestre dernier, je vais m'en tenir à ça.Java EE - Télécharger l'image dans la base de données?

Le seul problème que j'ai est de télécharger des images - je n'arrive pas à trouver des exemples. J'utilise des classes d'entités et des requêtes paramétrées. C'est le code pour écrire dans la base de données, qui fonctionne bien, je ne fais que définir la valeur de l'image blob à null pour le moment.

@Override 
    public void addClothes(String designer, String cname, String ctype, String desc) { 
     Clothes c = new Clothes(); 
     em.persist(c); 
     c.setDesigner(designer); 
     c.setCname(cname); 
     c.setCtype(ctype); 
     c.setDescript(desc); 
     c.setImage(null); 
    } 

J'ai un servlet qui prend un fichier, je ne suis pas sûr de savoir comment le fichier, lorsqu'il est passé, doivent être triés et ce que je dois écrire à la base de données (de ce que je vois, c'est l'octet [])

Une main dans la bonne direction serait appréciée!

+0

Duplication de http://stackoverflow.com/questions/7033676/how-to-upload-an-image-and-save-it-in-database – NullPointerException

+0

Votre approche est la bonne: enregistrez l'image sous forme de byte []. –

+0

A déjà regardé cette question et cela n'a pas aidé. Je suppose que mes requêtes principales sont que je peux faire quelque chose comme ceci clothesBean.addClothes (request.getParameter ("designer"), request.getParameter ("cname"), request.getParameter ("ctype"), request.getParameter ("desc"), request.getParamter ("image"); J'ai essayé de regarder cela, mais comme ça ne va être qu'une image par tuple, et il ne va pas y avoir une quantité massive de tuples, sauver à la base de données semble être plus facile http://forum.codecall.net/topic/64416-javaservlet-file-upload/ –

Répondre

0

Pour travailler avec mise en veille prolongée http://www.mkyong.com/hibernate/hibernate-save-image-into-database/

Pour travailler avec JDBC:

Pour écrire l'image dans la base de données à l'aide blob Jdbc, vous devez convertir le fichier dans INPUTSTREAM. instruction.setBinaryStream (2, (InputStream) inputStream, (int) (image.length())); Méthode d'offre d'instruction PreparedStatement setBinaryStream() qui est utilisée pour écrire un flux binaire dans la colonne BLOB de la base de données.

Voici un extrait de code pour vous aider:

File image = new File("C:/test.jpg"); 
inputStream = new FileInputStream(image); 

Prepared statement = //define as per your table 
// set the file binary stream 
statement.setBinaryStream(2, (InputStream) inputStream,(int) (image.length())); 

statement.executeUpdate(); 
+0

Il utilise un gestionnaire d'entité, ainsi JPA, pas JDBC –

0

Dans votre classe vêtements, vous pouvez ajouter:

@Lob 
private byte[] image; 

// Getter/Setter methods 
+0

Ma classe est dérivée de la structure de la base de données - Elle est déjà y contient cela avec les setters et getters pertinents. @Lob @Colonne (name = "IMAGE") octet privé [] image; –

+0

Je pense que vous avez terminé alors. – JamesB

+0

Je ne suis toujours pas sûr à 100%. Puis-je simplement utiliser request.getParameter() pour obtenir le fichier et l'écrire directement tel quel? Dois-je convertir/décompresser/etc pour sortir l'image de la base de données ou la reconnaîtra-t-elle automagiquement comme une image? –

1

Une fois que vous avez le fichier sur le serveur, soit dans la mémoire ou un fichier local ou temporaire (qui dépend du framework ou des bibliothèques que vous utilisez), vous aurez une référence d'un type wrapper. Si vous utilisez Apache Commons File Upload, vous avez une référence FileItem. Pour toute demande tout le contenu du fichier en tant que tableau d'octets:

byte[] contents = fileItem.get(); 

Si vous utilisez Tomahawk of Trinidad, vous avez une référence org.apache.myfaces.trinidad.model.UploadedFile. Pour toute demande tout le contenu du fichier en tant que tableau d'octets, vous pouvez utiliser la classe IOUtils du Apache Commons IO:

byte[] contents = IOUtils.toByteArray(uploadedFile.getInputStream()); 

de si vous avez une référence de org.apache.myfaces.custom.fileupload.UploadedFile, est plus simple:

byte[] contents = uploadedFile.getBytes(); 

MISE À JOUR

Si vous utilisez Java EE 6, vous pouvez utiliser les nouvelles fonctionnalités de la spécification Server 3.0 pour télécharger des fichiers sans bibliothèques supplémentaires. Voir l'excellent tutoriel de BalusC dans The BalusC Code: Uploading files in Servlet 3.0

+0

J'utilise JDBC derby avec GlassFish comme serveur d'application Tous les paramètres sont normalement dans l'objet request, donc pour une chaîne ou autre, J'utiliserait request.getParameter ("param_name") et ensuite passerais cette valeur au bean. –

0

Ça a marché! Un peu, avec ce code:

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
     out = response.getWriter(); 
     final String path = "clothesImages" + File.separator + request.getParameter("designer") + File.separator + request.getParameter("ctype") + File.separator + request.getParameter("cname"); 
     out.println(path); 
     String currentDir = new File(".").getAbsolutePath(); 
     out.println(currentDir); 
     final Part filePart = request.getPart("image"); 
     final String filename = "image.jpg"; 
     File file = new File(path); 
     if (!file.exists()){ 
      out.println("Dir Doesn't Exist"); 
      file.mkdirs(); 
     } 
     OutputStream outstream = null; 
     InputStream filestream = null; 

     try{ 
     outstream = new FileOutputStream(new File(path + File.separator + filename)); 
     filestream = filePart.getInputStream(); 
     int read = 0; 
     final byte[] bytes = new byte[1024]; 
     while((read = filestream.read(bytes)) != -1){ 
      outstream.write(bytes, 0, read); 
     } 
     out.println("New file " + filename + " created at " + path); 
     }catch (FileNotFoundException fne) { 
     out.println("You either did not specify a file to upload or are " 
       + "trying to upload a file to a protected or nonexistent " 
       + "location."); 
     out.println("<br/> ERROR: " + fne.getMessage()); 
     }finally { 
     if (out != null) { 
      out.close(); 
     } 
     if (filestream != null) { 
      filestream.close(); 
     } 
     if (outstream != null) { 
      outstream.close(); 
     } 
    } 

    } 

Le seul problème que j'ai est de définir le chemin du fichier.Le chemin est

C: \ Users \ Chris \ AppData \ Roaming \ NetBeans \ 7.2.1 \ config \ GF3 \ domain1 \

Mais je veux sauver dans

Projet-guerre/web/images

Des idées?

Questions connexes