通过PHP保存图片到mysql,如何使用MySQL保存一个图片并且用PHP得到它
點(diǎn)上面“東哥IT筆記”,關(guān)注并星標(biāo)
每天一篇業(yè)界最新技術(shù)分享
首先,我要說(shuō)的是把一個(gè)圖片保存在MySQL中,再讀出來(lái)是一個(gè)很不推薦的做法。我們只是看看假如真的要這樣做,該如何做,最后我會(huì)和大家聊聊一般我們?nèi)绾翁幚磉@種使用情況,以及不推薦這樣做的原因。
首先圖片是一個(gè)BLOB(Binary Large Object)是可以用來(lái)存儲(chǔ)二進(jìn)制的數(shù)據(jù)。這就是用來(lái)保存圖片,文件等等的數(shù)據(jù)。因?yàn)檫@種object通常都很大,所以我們需要定義一個(gè)很大的域來(lái)保存信息。如何通過(guò)PHP來(lái)插入呢,其實(shí)很簡(jiǎn)單:
1)讀取圖片成二進(jìn)制
2)準(zhǔn)備插入到數(shù)據(jù)庫(kù)
3)使用SQL語(yǔ)句插入相關(guān)數(shù)據(jù)到數(shù)據(jù)庫(kù)
下面我們來(lái)看看簡(jiǎn)單的PHP代碼:// Image submitted by form. Open it for reading (mode "r")$fp = fopen($_FILES['file_name']['tmp_name'], "r");// If successful, read from the file pointer using the size of thefile (in bytes) as the length.if ($fp) {$content = fread($fp,$_FILES['file_name']['size']);fclose($fp);// Add slashes to thecontent so that it will escape special characters.// As pointed out,mysql_real_escape_string can be used here as well. Yourchoice.$content =addslashes($content);// Insert into the table"table" for column "image" with our binary string of data("content")mysql_query("Insertinto table (image) Values('$content')");}
這里我們使用了fread()來(lái)把圖片讀取成比特,有了相關(guān)比特?cái)?shù)據(jù)之后,就是簡(jiǎn)單地把它插入到BLOB的列就可以了。我們例子中image列是一個(gè)BLOB的數(shù)據(jù)類(lèi)型。需要注意的是你選擇的BLOB的列大小需要能夠保存相應(yīng)圖片的大小,因?yàn)镸ySQL還是有不同大小的BLOB數(shù)據(jù)類(lèi)型的。
下面我們來(lái)看一下如何獲取圖片數(shù)據(jù),同樣需要三個(gè)步驟:
1)設(shè)置content的type到圖片的類(lèi)型
2)找到圖片,并且把它從數(shù)據(jù)庫(kù)中拿出來(lái)
3)顯示圖片
相關(guān)的代碼如下:// Read the row we want to pull out of the database.$result = mysql_query("select image from table where id =1");// If successful, fetch the row as an array and store the data fromthe "image" column into a variable.if ($result) {if ($row =mysql_fetch_array($result)) {$img =$row["image"];}}// Set the content type of this page to image/jpeg since the imagewe are pulling out is a jpgimage.header("Content-type: image/jpeg");// Echo out the image.echo "$img";
我們把數(shù)據(jù)從image列中拿出來(lái),并且保存在一個(gè)變量中,然后我們?cè)O(shè)置相關(guān)content-type為image/jpeg就可以了,然后就可以顯示相關(guān)的內(nèi)容了。
需要注意的是不要在header()調(diào)用之前打印任何部分,否則在調(diào)用header的時(shí)候會(huì)報(bào)錯(cuò)"Headersalready sent"。
其實(shí)說(shuō)白了,這個(gè)和別的BLOB數(shù)據(jù)的插入讀取是一樣的,并沒(méi)有任何差別。
下面我們來(lái)談?wù)劄槭裁床灰褕D片保存到數(shù)據(jù)庫(kù)中呢?因?yàn)閿?shù)據(jù)庫(kù)一般為了查詢(xún)的方便會(huì)進(jìn)行分頁(yè),而一些大的數(shù)據(jù)則會(huì)導(dǎo)致查詢(xún)變得很慢,所以我們還是不要這樣做為好。
那么推薦的做法是什么呢?我們一般會(huì)存儲(chǔ)相關(guān)文件的路徑就可以了。當(dāng)想要找相關(guān)文件的時(shí)候,只要找到相關(guān)的路徑就可以了,然后再根據(jù)相關(guān)的路徑去磁盤(pán)找到需要顯示的文件就可以了。這樣做有兩個(gè)好處:1)這樣數(shù)據(jù)庫(kù)的數(shù)據(jù)就很小了。2)有了文件的名字,我們就可以用文件名來(lái)查找相關(guān)的文件了。
好了,這就是本文要講的內(nèi)容了。
總結(jié)
以上是生活随笔為你收集整理的通过PHP保存图片到mysql,如何使用MySQL保存一个图片并且用PHP得到它的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从此爱情与我无关,只做一个嗜钱如命的渣男
- 下一篇: nodejs mysql 耗硬盘_nod