最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

保存圖片到MySQL以及從MySQL讀取圖片全過程

 更新時(shí)間:2023年05月19日 10:15:54   作者:讓線程再跑一會(huì)  
有人喜歡使用mysql來存儲(chǔ)圖片,而有的人喜歡把圖片存儲(chǔ)在文件系統(tǒng)中,而當(dāng)我們要處理成千上萬的圖片時(shí),會(huì)引起技術(shù)問題,下面這篇文章主要給大家介紹了關(guān)于如何保存圖片到MySQL以及從MySQL讀取圖片的相關(guān)資料,需要的朋友可以參考下

接上次 爬取表情包 ,這次我們直接將表情包存到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ǔ)空間

  • TINYBLOB 255個(gè)字節(jié)
  • BLOB 65535字節(jié)
  • MEDIUMBLOB 16M
  • LONGBLOB 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)為二進(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ù)庫存放圖片的原因如下:

  1. 數(shù)據(jù)庫性能下降:存儲(chǔ)大量數(shù)據(jù)將占用大量的磁盤空間和系統(tǒng)資源,特別影響數(shù)據(jù)庫性能,尤其是多用戶訪問的情況
  2. 數(shù)據(jù)庫的備份和維護(hù)變得困難,且可讀性差
  3. 壓力測(cè)試:多用戶同時(shí)上傳或下載圖片時(shí),將導(dǎo)致數(shù)據(jù)庫服務(wù)器壓力負(fù)載過大
  4. 圖片質(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)文章

最新評(píng)論

大连市| 林口县| 宣城市| 隆昌县| 安福县| 梓潼县| 抚顺市| 通州市| 抚州市| 常宁市| 成都市| 临漳县| 离岛区| 阳江市| 永和县| 凌海市| 安岳县| 双江| 石阡县| 平利县| 禄丰县| 正定县| 友谊县| 许昌县| 凉城县| 鹤岗市| 垣曲县| 嫩江县| 任丘市| 汕头市| 垫江县| 县级市| 合山市| 抚松县| 繁峙县| 洛浦县| 西吉县| 仪陇县| 新乐市| 军事| 金阳县|