2013-02-23 85 views
3

我想从Java Swift应用程序中保存图像在MySQL数据库中。我正在使用JFileChsoser来获取图像的路径。然后转换文件,以便它可以保存在BLOB类型的MySQL列中。但是我试图保存的每张图片都不能正确保存或正确转换。有人能告诉我我在这里做错了什么吗?在Java中保存图像从Java

private void btn_choosepicActionPerformed(java.awt.event.ActionEvent evt) { 
    JFileChooser picchooser = new JFileChooser(); 
    picchooser.setDialogTitle("Select Image"); 
    picchooser.showOpenDialog(null); 
    File pic=picchooser.getSelectedFile(); 
    path= pic.getAbsolutePath(); 
    txt_path.setText(path.replace('\\','/')); 
    try{ 
     File image = new File(path); 
     FileInputStream fis = new FileInputStream(image); 
     ByteArrayOutputStream baos= new ByteArrayOutputStream(); 
     byte[] buff = new byte[1024]; 
     for(int readNum; (readNum=fis.read(buff)) !=-1 ;){ 
      baos.write(buff,0,readNum); 
     } 
     userimage=baos.toByteArray(); 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    }  
} 

然后在这之后,我把它保存到数据库中,就像这样。

private void btn_saveActionPerformed(java.awt.event.ActionEvent evt) { 
    String user= txt_username.getText(); 
    try{ 
     String sql="insert into imgtst (username,image) values ('"+user+"','"+userimage+"')"; 
     pst=con.prepareStatement(sql); 
     pst.executeUpdate(); 
     JOptionPane.showMessageDialog(null, "Saved"); 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

,我已经声明的变量userimage和路径作为一个全局变量

String path=null; 
byte[] userimage=null; 
+1

这不是一个很好的做法,店面形象,在MySQL数据库中的BLOB。您应该先将该文件(本例为图像)复制到应用程序文件夹,然后将该图像的路径存储在数据库中,而不是图像作为BLOB。 – dzeno 2013-02-23 01:39:11

+0

不要在DB中存储图像。请将它们放在一个文件夹中,并将路径存储在数据库中。 – Amarnath 2013-02-23 01:45:31

+0

@dzeno我正在为大学做一个项目。我按照你刚刚讲的方式做了确切的方式。但一位心灵的朋友坚持将图像存储在MySQL数据库中。所以才帮她出去。 – 2013-02-23 02:00:09

回答

9

你在你的SQL语句的byte []转换成字符串,你将结束与不正确的数据。

使用BLOB的正确方法是通过InputStream本身。您可以使用您正在使用的FileInputStream来读取文件。

File image = new File(path); 
FileInputStream fis = new FileInputStream (image); 

String sql="insert into imgtst (username,image) values (?, ?)"; 
pst=con.prepareStatement(sql); 

pst.setString(1, user); 
pst.setBinaryStream (2, fis, (int) file.length()); 

当您检索回来,你同样可以得到从ResultSetInputStream

InputStream imgStream = resultSet.getBinaryStream(2); 
+0

啊非常感谢提示。它的工作现在。我做到了。 'String sql =“insert into imgtst(username,image)values(?,?)”; pst = con.prepareStatement(sql); String user = txt_username.getText(); pst.setString(1,user); pst.setBytes(2,userimage); pst.executeUpdate();' – 2013-02-23 01:56:04

+0

是的,也可以。由于您首先将文件读入字节数组,然后再次读取字节数组以将其传递到数据库,并且如果文件很大,则会消耗更多的内存,因为您需要首先将其全部加载。而我的例子则是通过从文件到数据库的数据“管道”。您可以通过'btn_choosepicActionPerformed()'将'File image'保存为一个成员变量,然后在'btn_saveActionPerformed()'中打开流并将其发送到数据库。 – jbx 2013-02-23 13:47:25