新聞中心
實(shí)現(xiàn)數(shù)據(jù)庫存儲(chǔ)圖片技巧

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、準(zhǔn)格爾ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的準(zhǔn)格爾網(wǎng)站制作公司
在現(xiàn)代應(yīng)用程序中,圖片是一個(gè)必不可少的元素,而且往往需要支持圖片上傳、處理、存儲(chǔ)、展示等功能。其中,存儲(chǔ)圖片是非常關(guān)鍵的一個(gè)環(huán)節(jié),傳統(tǒng)的做法是將圖片存儲(chǔ)在文件系統(tǒng)中,但是這樣存在一些問題,例如:不便于備份、遷移、不同步等。另外,當(dāng)我們需要和數(shù)據(jù)庫進(jìn)行集成時(shí),就需要用到數(shù)據(jù)庫存儲(chǔ)圖片技巧。
本文將介紹如何在數(shù)據(jù)庫中存儲(chǔ)圖片,并重點(diǎn)講解以下技巧:
1. 以二進(jìn)制數(shù)據(jù)存儲(chǔ)圖片
2. 使用Base64編碼圖片
3. 利用Blob類型存儲(chǔ)圖片
1. 以二進(jìn)制數(shù)據(jù)存儲(chǔ)圖片
之一種方法是直接將圖片存儲(chǔ)在數(shù)據(jù)庫中的表中。具體的做法是在數(shù)據(jù)庫建立一個(gè)表,其中需要包含一個(gè)二進(jìn)制類型(BLOB)的列,以存儲(chǔ)圖片數(shù)據(jù)。這種方式適用于小圖片,而對(duì)于大圖片,會(huì)造成數(shù)據(jù)庫性能問題。
以下是一個(gè)建立圖片存儲(chǔ)表的SQL語句:
“`
CREATE TABLE `image_table` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(255) NOT NULL,
`image_content` blob NOT NULL,
PRIMARY KEY (`image_id`)
);
“`
其中image_id和image_name可以自行定義,image_content為二進(jìn)制類型,并且不能為空。
2. 使用Base64編碼圖片
第二種方法是將圖片轉(zhuǎn)換為Base64編碼,然后存儲(chǔ)在數(shù)據(jù)庫中。Base64是一種基于64個(gè)字符的編碼方式,可以將任意二進(jìn)制數(shù)據(jù)編碼成可打印的ASCII字符。這種方式適用于小圖片,而對(duì)于大圖片,雖然可以避免數(shù)據(jù)庫性能問題,但是會(huì)占用更多的存儲(chǔ)空間。
以下是一個(gè)建立圖片存儲(chǔ)表的SQL語句:
“`
CREATE TABLE `image_table` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(255) NOT NULL,
`image_base64` text NOT NULL,
PRIMARY KEY (`image_id`)
);
“`
其中image_id和image_name可以自行定義,image_base64為文本類型,并且不能為空。
下面是一個(gè)將圖片轉(zhuǎn)換為Base64編碼的示例代碼:
“`
public static String imageToBase64(String imagePath) throws IOException {
InputStream inputStream = new FileInputStream(imagePath);
byte[] bytes = new byte[inputStream.avlable()];
inputStream.read(bytes);
inputStream.close();
return Base64.getEncoder().encodeToString(bytes);
}
“`
3. 利用Blob類型存儲(chǔ)圖片
第三種方法是將圖片存儲(chǔ)在數(shù)據(jù)庫中,但使用分離存儲(chǔ)技術(shù),即將圖片存儲(chǔ)在操作系統(tǒng)文件系統(tǒng)中,通過數(shù)據(jù)庫中的Blob類型引用這些文件。這種方法可用于大圖片,并且保證了數(shù)據(jù)庫的高性能和存儲(chǔ)空間的有效利用。
以下是一個(gè)建立圖片存儲(chǔ)表的SQL語句:
“`
CREATE TABLE `image_table` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(255) NOT NULL,
`image_blob` blob NOT NULL,
PRIMARY KEY (`image_id`)
);
“`
其中image_id和image_name可以自行定義,image_blob為二進(jìn)制類型,并且不能為空。
下面是一個(gè)將圖片存儲(chǔ)到操作系統(tǒng)文件系統(tǒng)中,并返回Blob類型的示例代碼:
“`
public static Blob imageToBlob(String imagePath) throws IOException, SQLException {
FileInputStream fileInputStream = new FileInputStream(imagePath);
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”, “root”, “password”);
PreparedStatement preparedStatement = connection.prepareStatement(“INSERT INTO image_table(image_name, image_blob) VALUES(?,?)”);
preparedStatement.setString(1, “image”);
preparedStatement.setBinaryStream(2, fileInputStream, fileInputStream.avlable());
preparedStatement.executeUpdate();
ResultSet resultSet = preparedStatement.getGeneratedKeys();
resultSet.next();
long imageId = resultSet.getLong(1);
preparedStatement.close();
connection.close();
return getBlob(imageId);
}
private static Blob getBlob(long imageId) throws SQLException {
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”, “root”, “password”);
PreparedStatement preparedStatement = connection.prepareStatement(“SELECT image_blob FROM image_table WHERE image_id=?”);
preparedStatement.setLong(1, imageId);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
Blob blob = resultSet.getBlob(1);
preparedStatement.close();
connection.close();
return blob;
}
“`
本文介紹了三種在數(shù)據(jù)庫中存儲(chǔ)圖片的技巧,側(cè)重于講解二進(jìn)制存儲(chǔ)和Blob存儲(chǔ),同時(shí)提供了Base64編碼存儲(chǔ)的示例代碼。對(duì)于不同的業(yè)務(wù)需求,可以選擇不同的存儲(chǔ)方式,但需要注意數(shù)據(jù)庫的性能和存儲(chǔ)空間的利用。建議盡量利用數(shù)據(jù)庫中高級(jí)類型,特別是Blob類型,來合理存儲(chǔ)圖片數(shù)據(jù)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220php 數(shù)據(jù)庫圖片存儲(chǔ)問題?
相對(duì)路徑,從你項(xiàng)目根目錄開始的,取用的時(shí)候在拼接前邊的路徑,比如你在本地開發(fā),路徑輪檔存的是你的c盤,換臘粗亂到別人電腦上在d盤就不好使了,凳裂傳到服務(wù)器上同樣報(bào)錯(cuò)
存儲(chǔ)的是相對(duì)路徑,可以到網(wǎng)站服務(wù)器上查看,應(yīng)該有upload文件夾,里面就是存儲(chǔ)的圖片,這樣寫的好處是節(jié)省了數(shù)據(jù)庫存儲(chǔ)空間,轉(zhuǎn)移的時(shí)候可以直接將整個(gè)服務(wù)器的圖片打包轉(zhuǎn)移。
訪問的時(shí)候,前面可以拼接域名和指定的路盯正歷徑,這些后臺(tái)可以輕松獲取到,然后拼接上服務(wù)器的路徑,我們就可以直接在網(wǎng)頁問到圖片了。
這是很常見的圖片數(shù)據(jù)凱搜庫保存方式,和直接把圖片的二進(jìn)制存入數(shù)據(jù)庫,這樣的方式便于檢索,占用空間小。當(dāng)然,目前主流都采用oss來單獨(dú)存儲(chǔ)文件了,就是有專門的文件服務(wù)器,這個(gè)時(shí)候,一般存儲(chǔ)的是清弊完整的圖片路徑。
如果儲(chǔ)存具體的路徑,那么數(shù)據(jù)哪瞎段中將會(huì)包含很多重復(fù)的字串,會(huì)造成空間的浪費(fèi),所以一般都是儲(chǔ)存相對(duì)路徑(相對(duì)于頁面文件李譽(yù)的路徑),使用神櫻時(shí)只需要直接放入img標(biāo)簽的src屬性中即可。
$file = $_FILES; //上傳的圖片相關(guān)信息
$suffix = strtolower(strrchr($file,’.’)); //返回后綴 wav strrchr分割獲取字符串 strtolower轉(zhuǎn)小寫
$filename = uniqid(“img_”,false); //生成以chat_pcm_開頭的唯一id
$uploadpath = ROOT_PATH.’uploads/’; //保存路徑
$file_up = $uploadpath.$filename.jpg; //保存文件的絕對(duì)路徑 路徑、文件名、后綴
$re = move_uploaded_file($file,$file_up); //move_uploaded_file() 函褲好數(shù)將上傳的文件移動(dòng)到新位置。 參數(shù)乎純巖1:規(guī)定要移動(dòng)的文件 參數(shù)2:移動(dòng)到的位置
然后獲取名稱存進(jìn)數(shù)據(jù)(進(jìn)行數(shù)據(jù)庫操作)
數(shù)據(jù)庫存取圖片的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫存取圖片,「實(shí)現(xiàn)數(shù)據(jù)庫存儲(chǔ)圖片技巧」,php 數(shù)據(jù)庫圖片存儲(chǔ)問題?的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
網(wǎng)站標(biāo)題:「實(shí)現(xiàn)數(shù)據(jù)庫存儲(chǔ)圖片技巧」(數(shù)據(jù)庫存取圖片)
網(wǎng)頁地址:http://m.fisionsoft.com.cn/article/djodiih.html


咨詢
建站咨詢
