2013-02-23 40 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