2012-02-03 47 views
-1

我真的不理解字節數組...可能是因爲我在處理圖像時,第一次如此需要你的幫助從數據庫中檢索字節組在servlet和JSP中

我的base64字符串R0lGODlhDwAPAKECAAAAzMzM///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

對此我解碼並將其存儲在數據庫中的MySQL然後我使用上我的servlet側下面的代碼

if (request.getParameter("imgID") != null) 
    { 

     iNumPhoto = Integer.parseInt(request.getParameter("imgID")) ; 


     try 
     { 
       Class.forName("com.mysql.jdbc.Driver").newInstance(); 
       conn=DriverManager.getConnection("jdbc:mysql://localhost:9191/mbcss","root","admin"); 
       stmt= conn.createStatement(); 

     //conn.setAutoCommit (false); 

     // get the image from the database 
     byte[] imgData = GetPhoto.getPhoto(conn, iNumPhoto); 
     System.out.println("imgData="+imgData); 
     // display the image 
     response.setContentType("image/gif"); 
     OutputStream o = response.getOutputStream(); 
     o.write(imgData); 

     o.flush(); 
     o.close(); 
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 

     } 
    } 
     } 

這裏是getPhoto方法

public static byte[] getPhoto (Connection conn, int iNumPhoto) 
throws Exception, SQLException 
{ 
String req = "" ; 
Blob img ; 
byte[] imgData = null ; 
Statement stmt = conn.createStatement(); 

// Query 
req = "Select image From visit"; 

ResultSet rset = stmt.executeQuery (req); 

while (rset.next()) 
{  
    img = rset.getBlob(1); 
    imgData = img.getBytes(1,(int)img.length()); 
}  

rset.close(); 
stmt.close(); 

return imgData ; 
} 

訪問表中只有1個的紀錄,但每當我執行我的JSP文件,該文件調用servlet類imgData我已經印我的控制檯上的每個刷新打印不同的價值和形象是也沒有顯示在JSP上

  1. 每次顯示不同的值是編碼錯誤或字節數組的特性。
  2. 爲什麼不顯示圖像幫助我
+0

解碼圖像可能是圖像未正確顯示在JSP中的原因。嘗試將圖像數據直接存儲到數據庫而不進行解碼。 – 2012-02-04 05:39:58

+0

@Ravindra Gullapalli你的意思是說,我應該將圖像存儲爲base64字符串只...這對我來說效率太低.. – 2012-02-04 08:21:34

回答

0

您需要檢查以下內容:

  1. 在您的查詢「從訪問選擇像」我不明白的WHERE子句限制結果,所以如果你有很多行,它可能是每次刷新頁面時獲得不同結果的原因。

  2. 戰場圖像是BLOB類型的數據庫?

編輯:

檢查的MySQL的文檔,你需要遵循一些規則。首先,該方法必須是getBytes而不是getBlob。其他規則是:

與連接器/ J版本3.1.0開始,您可以通過添加屬性emulateLocators =忠於你的JDBC URL模仿與 定位器的BLOB。使用這種方法 ,司機將延遲,直到您檢索其他數據加載的實際BLOB數據 然後用對BLOB數據流檢索方法 (的getInputStream(),getBytes()構造,等等)。

必須使用列別名與列的值的BLOB的實際 名稱,例如:

SELECT ID,「數據」從blobtable blob_data您也必須遵循 以下規則:

的SELECT必須引用只有一個表。該表必須具有 主鍵。

的SELECT必須別名原始BLOB列名,指定爲 串,到備用名稱。

SELECT必須覆蓋組成主鍵的所有列。

的BLOB實現不允許就地修改(它們是 副本,由DatabaseMetaData.locatorsUpdateCopies()方法 報道)。因此,請使用PreparedStatement.setBlob()或ResultSet.updateBlob()的相應 方法(在 可更新結果集的情況下)將更改保存回數據庫。

您可以查看更多在:http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html

+0

我已經提到只有1行,因爲我也用where子句進行了測試,但之後刪除除1以外的所有行測試..因此,只有1行和數據類型是BLOB – 2012-02-03 21:19:46

+0

我沒有訪問表中的主鍵..你可以告訴我我應該做什麼...從你的上述文件現在有什麼變化我應該使 – 2012-02-03 21:49:58

+0

你必須創建一個PK,如果你不想使用它們,你可以創建一個帶有自動增量功能的「id」列。如果你的數據在生產中,你可以用PK創建一個臨時表,然後從舊錶加載數據,最後重命名錶。 – 2012-02-03 22:01:41

0

你會看到從BLOB數據庫中的記錄中的最後一個圖像文件,因爲byat陣列清理一下每一個新的記錄,並在更換新的圖像文件,以修復位置jsp頁面需要將文件寫入本地目錄,並且需要將路徑指向該位置

+0

首先,我只有1條記錄在我的數據庫..第二我試圖fileoutputstream首先保存圖像驅動器..有些9字節的文件正在創建,但沒有它的圖像 – 2012-02-04 12:56:02

0

您需要確保正確解碼Base64編碼圖像,並確保代碼沒有問題將圖像添加到數據庫。

經過相反的過程:
(1)檢索字節數組從數據庫
(2)不要Base64編碼字節數組圖像表示
(3)創建從Base64編碼字節數組的字符串。

您這樣做必須具有相同的價值與原中得到的字符串: R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

如果是這樣的話,那麼你知道你正在做的解碼和數據庫存儲正確;否則,如果值不同,則需要修復解碼或數據庫存儲代碼。