保存圖片到MySQL以及從MySQL讀取圖片全過程
接上次 爬取表情包 ,這次我們直接將表情包存到MySQL數(shù)據(jù)庫而不是本地。
1. 創(chuàng)建數(shù)據(jù)庫
首先創(chuàng)建一個數(shù)據(jù)庫,數(shù)據(jù)庫名為ikun,表名為img,3個字段分別為id(圖片id)、img(二進制碼)、date(存儲時間)
其中,二進制碼的存儲格式應該為 BLOB類型,下面為不同類型對應的最大存儲空間
TINYBLOB
255個字節(jié)BLOB
65535字節(jié)MEDIUMBLOB
16MLONGBLOB
4G
USE ikun; CREATE TABLE `img` ( `id` int NOT NULL AUTO_INCREMENT, `img` mediumblob NOT NULL, `date` date NOT NULL, PRIMARY KEY (`id`) ) ;
2. 保存圖片到數(shù)據(jù)庫
將圖片轉(zhuǎn)為二進制流
對于圖片的輸入和輸出,我們更多使用BufferedInputStream或者BufferedOutPutStream
public static void saveInMySQL(String url) throws IOException { //獲得連接對象 Connection con = DBUtil.getConnection("root","******","ikun"); PreparedStatement pre = null; //獲取圖片信息,做輸出流 InputStream in = getEntityByHttpGetMethod(url).getContent(); BufferedInputStream inputStream = new BufferedInputStream(in); try { String sql = "insert into img (img,date) values (?,?)"; pre = con.prepareStatement(sql); pre.setBinaryStream(1,inputStream,in.available()); Date date = new Date(System.currentTimeMillis()); pre.setDate(2,date); //獲取返回結果 int i = pre.executeUpdate(); System.out.println(i); } catch (SQLException e) { e.printStackTrace(); } }
查看效果
3. 從數(shù)據(jù)庫讀取圖片
將二進制流轉(zhuǎn)為文件輸出到本地查看
public static void readFromMysql(){ //獲得連接對象 Connection con = DBUtil.getConnection("root","******.","ikun"); PreparedStatement pre = null; ResultSet res = null; try { //這里讀取一張 String sql = "select * from img where id = 1"; pre = con.prepareStatement(sql); res = pre.executeQuery(sql); while (res.next()){ int id = res.getInt("id"); InputStream stream = res.getBinaryStream("img"); Date date = res.getDate("date"); System.out.println("圖片id為"+id+" 創(chuàng)建時間為"+date.toString()); Files.copy(stream, Paths.get("D:\\ikun.jpg")); } } catch (SQLException | IOException e) { e.printStackTrace(); } //斷開連接 DBUtil.close(); }
寫在最后
??通常我們建議不要直接將圖片存到數(shù)據(jù)庫中,而是放到本地磁盤目錄下,我們通常將圖片統(tǒng)一命名,通過其文件名或路徑來訪問數(shù)據(jù)庫實現(xiàn)獲取圖片的目的。
??而不建議直接往數(shù)據(jù)庫存放圖片的原因如下:
- 數(shù)據(jù)庫性能下降:存儲大量數(shù)據(jù)將占用大量的磁盤空間和系統(tǒng)資源,特別影響數(shù)據(jù)庫性能,尤其是多用戶訪問的情況
- 數(shù)據(jù)庫的備份和維護變得困難,且可讀性差
- 壓力測試:多用戶同時上傳或下載圖片時,將導致數(shù)據(jù)庫服務器壓力負載過大
- 圖片質(zhì)量下降:比如我們待會的運行結果其實是這樣的,左邊是我們下載到本地的圖片,右邊則是下載到數(shù)據(jù)庫,再從數(shù)據(jù)庫讀取出來的效果。而且我將二進制數(shù)值類型設置為最大還是模糊。
到此這篇關于保存圖片到MySQL以及從MySQL讀取圖片的文章就介紹到這了,更多相關保存圖片到MySQL及讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧
這篇文章主要介紹了Windows 10,MySQL版本是5.7.12-log環(huán)境下mysql中聚合函數(shù)count的使用和性能優(yōu)化,需要的朋友可以參考下2018-06-06mysql?子查詢的概述和分類及單行子查詢功能實現(xiàn)
本文詳細介紹了MySQL的子查詢概念和應用,解釋了子查詢是在主查詢中嵌套另一個查詢,包括外查詢和內(nèi)查詢,并從多個角度進行分類,文章還深入探討了子查詢的編寫技巧和使用場景,對于學習和應用MySQL的人來說,這是一篇非常有價值的指南2024-10-10