2013-08-24 68 views
1

我的xhtml中有一個畫布元素。我把它轉換成一個base-64編碼的String,調用了一個toDataUrl()調用的dataUrl。這將產生以下輸出,截斷清晰:將轉換的Canvas DataURL字節保存到數據庫時Blob損壞

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzQAAAImCAYAAACFG89TAAAgAElEQVR4Xu29C7x/5Zj3 [lots of characters...]" 

我想這個圖像發送到我的MySQL數據庫。我的實體中有一個Blob(@Lob)字段,爲了將此字符串轉換爲字節數組,請使用dataUrl.getData()並使用此字節數組更新我的實體。

在我的MySQL數據庫中,成功創建了BLOB。但是,當我右鍵單擊它並單擊在編輯器中打開文件時,我看到字節選項卡罰款,但收到一個通用的錯誤,當我點擊圖像選項卡,建議字節已損壞。

這意味着,當欲讀取該文件,使用BufferedImage imag = ImageIO.read(is);其中isByteArrayInputStream與字節數組作爲參數,返回imag空,更具體地BufferedImage類內的方法read

編輯:看截圖,第一個是dataUrl.getBytes()調用,第二個是MySQL輸出。

enter image description here

enter image description here

+0

那麼你在字節選項卡中看到了什麼值?你從dataUrl.getData()中得到了什麼字節?請在每種情況下(比如說)前16個字節編輯您的問題。 –

+0

用此信息更新了我的問題。 – tacua

+0

第一個屏幕截圖實際上並沒有顯示任何數據,是嗎?請展開第一行。 –

回答

2

相反的String.getBytes(),我用:

BASE64Decoder decoder = new BASE64Decoder(); 
byte[] b = decoder.decodeBuffer(dataURL.split("^data:image/(png|jpg);base64,")[1]); 

它工作得很好。

1

好吧,這聽起來像dataUrl.getData()你不工作。您存儲的字節基本上是「data:image/png; base64,iVBORw0KGg ...」的ASCII,而不是存儲在base64部件本身內的二進制數據。

您可能會在某處進行雙重編碼 - 在看不到您的代碼時很難分辨 - 但這就是我們目前所看到的。

我建議你看看之前的字節數組,你將它存儲在數據庫中。前幾個字節應該是0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a。一旦你有部分工作,如果它仍然不工作,你可以前進。

基本上,檢查數據階段的過程,所以你可以檢測到失敗的解碼/雙編碼/無論它是。

相關問題