保存圖片到MySQL以及從MySQL讀取圖片全過程
接上次 爬取表情包 ,這次我們直接將表情包存到MySQL數(shù)據(jù)庫而不是本地。
1. 創(chuàng)建數(shù)據(jù)庫
首先創(chuàng)建一個(gè)數(shù)據(jù)庫,數(shù)據(jù)庫名為ikun,表名為img,3個(gè)字段分別為id(圖片id)、img(二進(jìn)制碼)、date(存儲(chǔ)時(shí)間)
其中,二進(jìn)制碼的存儲(chǔ)格式應(yīng)該為 BLOB類型,下面為不同類型對(duì)應(yīng)的最大存儲(chǔ)空間
TINYBLOB255個(gè)字節(jié)BLOB65535字節(jié)MEDIUMBLOB16MLONGBLOB4G
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)為二進(jìn)制流
對(duì)于圖片的輸入和輸出,我們更多使用BufferedInputStream或者BufferedOutPutStream
public static void saveInMySQL(String url) throws IOException {
//獲得連接對(duì)象
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);
//獲取返回結(jié)果
int i = pre.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
}查看效果

3. 從數(shù)據(jù)庫讀取圖片
將二進(jìn)制流轉(zhuǎn)為文件輸出到本地查看
public static void readFromMysql(){
//獲得連接對(duì)象
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)建時(shí)間為"+date.toString());
Files.copy(stream, Paths.get("D:\\ikun.jpg"));
}
} catch (SQLException | IOException e) {
e.printStackTrace();
}
//斷開連接
DBUtil.close();
}寫在最后
??通常我們建議不要直接將圖片存到數(shù)據(jù)庫中,而是放到本地磁盤目錄下,我們通常將圖片統(tǒng)一命名,通過其文件名或路徑來訪問數(shù)據(jù)庫實(shí)現(xiàn)獲取圖片的目的。
??而不建議直接往數(shù)據(jù)庫存放圖片的原因如下:
- 數(shù)據(jù)庫性能下降:存儲(chǔ)大量數(shù)據(jù)將占用大量的磁盤空間和系統(tǒng)資源,特別影響數(shù)據(jù)庫性能,尤其是多用戶訪問的情況
- 數(shù)據(jù)庫的備份和維護(hù)變得困難,且可讀性差
- 壓力測(cè)試:多用戶同時(shí)上傳或下載圖片時(shí),將導(dǎo)致數(shù)據(jù)庫服務(wù)器壓力負(fù)載過大
- 圖片質(zhì)量下降:比如我們待會(huì)的運(yùn)行結(jié)果其實(shí)是這樣的,左邊是我們下載到本地的圖片,右邊則是下載到數(shù)據(jù)庫,再從數(shù)據(jù)庫讀取出來的效果。而且我將二進(jìn)制數(shù)值類型設(shè)置為最大還是模糊。
到此這篇關(guān)于保存圖片到MySQL以及從MySQL讀取圖片的文章就介紹到這了,更多相關(guān)保存圖片到MySQL及讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)
這篇文章主要介紹了Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù),實(shí)現(xiàn)原理也很簡(jiǎn)單,mysql刪除重復(fù)數(shù)據(jù),多個(gè)字段分組操作,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
一文教你學(xué)會(huì)定位線上MySQL鎖超時(shí)問題
這篇文章主要介紹了一文教你學(xué)會(huì)定位線上MySQL鎖超時(shí)問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
MySQL 使用DQL命令查詢數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了MySQL 使用DQL命令查詢數(shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
mysql存儲(chǔ)過程多層游標(biāo)循環(huán)嵌套的寫法分享
這篇文章主要介紹了mysql存儲(chǔ)過程多層游標(biāo)循環(huán)嵌套的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
mysql 5.7 數(shù)據(jù)庫安裝步驟個(gè)人總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫安裝步驟個(gè)人總結(jié),需要的朋友可以參考下2017-09-09
MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試
MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試...2006-12-12
mysql5.6批量設(shè)置表ROW_FORMAT =DYNAMIC問題
這篇文章主要介紹了mysql5.6批量設(shè)置表ROW_FORMAT =DYNAMIC問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10

