1. 程式人生 > >mysql以blob儲存圖片檔案的儲存和讀取問題解決

mysql以blob儲存圖片檔案的儲存和讀取問題解決

BLOB儲存圖片格式問題

因為專案需要儲存網路上使用者頭像的資訊,前面的文章也說過儲存的方法,後來為了鍛鍊自己,就選擇了以blob形式儲存圖片,而非圖片路徑。之前因為做的是一個網站的影象採集,存入資料庫後,發現有一小部分出現了圖片顯示成不全,模糊等症狀,如圖:

因為所佔部分比較少,只有2%左右,還處於可以接受的水平,而且當時為了開發功能,也就沒有進行細緻的研究。但結果就是針對另一個網站進行影象存取的時候,unbelievable事情發生了,截個圖讓大家見識一下:

這貌似就是shit,根本不符合開發的要求,當初還以為是另一個同志的讀取資料庫方法上有問題,要不怎麼可能差距這麼大。

仔細想了想,自己進行了測試,首先提取圖片連結,使用inputstream和outputstream流結合fileoutputstream存取,發現所得圖片全為正常,這說明,在獲取的inputstream位元組流是木有問題的。隨後將位元組流存入資料庫的blob型別中,然後用同樣的outputstream流,fileoutputstream接受儲存本地圖片,結果就成現在這個樣子了。

就此,問題出現了,位元組流寫入資料庫blob出現了問題。鑑於此問題的嚴重性,自己在網上尋找解決位元組流寫入資料庫的其他方案,有byte[]陣列方式,轉化為String方式,ByteArrayStream位元組流方式。但,因為個人實力有限,雖然找到了這些寫入的方式,有的在inputstream轉化byte[] 上出問題,有的不支援HttpStream流到byteArraySteam流的轉化,String流還要更改資料庫設計等問題,方法沒有實現。

幾次嘗試的失敗,於是動腦筋想了想有沒有其它的解決方式呢,最後腦門一熱,想到了既然httpStream流直接轉化為inputstream是正常的,而轉化為其它流檔案則是問題,而inputstream位元組流直接儲存圖片也沒有問題,那為何不來個中轉的方式,先將圖片httpStream流變為變為相應檔案暫存,稍後再用fileinputstream流取出,然後再寫入資料庫。

 URL myurl = new URL(imageUrl);   
            URLConnection myconn = myurl.openConnection();   
            in = myconn.getInputStream(); 
            //先寫入到檔案
            OutputStream myos = null;   
            try {   
                myos = (new FileOutputStream("[暫存]"+".jpg"));   
                byte[] buff = new byte[1024];   
                int num = 0;   
                while((num = in.read(buff))!= -1)   
                {   
                    myos.write(buff, 0, num);   
                    myos.flush();   
                }     
inputstream newin = new FileInputStream("[暫存].jpg");
}

經過上面的折騰,猛然發現,問題解決了,雖然最終為何會出現圖片進入資料庫後顯示出現問題還沒有找到答案,但目前的問題算是解決了,下面是顯示正常的截圖。