php mysql 图像_将图像插入MySQL并使用PHP检索图像
此文可能比較繁瑣,有更好的方法,但是出于教程目的,這是我的"“最佳實(shí)踐”的路線。
今天,我們將討論一個(gè)似乎每個(gè)人都有些困惑的話題……在MySQL中存儲BLOB圖像,然后使用PHP再次顯示它們。盡管始終建議不要這樣做,但我先展示一些演示代碼,說明如何實(shí)現(xiàn)此目標(biāo),并討論為什么/為什么不這樣做。然后,討論一些替代方案,以及為什么與直接將圖像直接存儲到數(shù)據(jù)庫相比。
因此BLOB或“Binary Large Objects”是數(shù)據(jù)庫中用于存儲原始二進(jìn)制數(shù)據(jù)的字段。這些數(shù)據(jù)可能代表圖片,文件或二進(jìn)制格式的文本。由于這些類型的對象相當(dāng)大(甚至可能是千兆字節(jié)大小),因此該字段旨在容納大量信息。我們?nèi)绾卧赑HP中使用這些字段來插入個(gè)人資料圖片?
1、我們必須將圖像讀取為二進(jìn)制。
2、我們必須準(zhǔn)備將其插入數(shù)據(jù)庫(轉(zhuǎn)義)。
3、我們使用典型的SQL將其插入數(shù)據(jù)庫中
對于我們的示例,我們將使用三步過程...
1、設(shè)置文檔的內(nèi)容類型以使其與圖片類型相匹配(對于jpg圖片,圖像/ jpeg)
2、在數(shù)據(jù)庫中找到圖像并將其拔出
3、顯示它
//圖片由表單提交。打開它進(jìn)行閱讀(模式“ r”)
$ fp = fopen($ _ FILES ['file_name'] ['tmp_name'],“ r”);
//如果成功,則使用文件大小(以字節(jié)為單位)作為長度從文件指針讀取。 如果($ fp){
$ content = fread($ fp,$ _FILES ['file_name'] ['size']);
fclose($ fp);
//在內(nèi)容中添加斜杠,以便轉(zhuǎn)義特殊字符。 //如前所述,在這里也可以使用mysql_real_escape_string。你的選擇。 $ content =加號($ content);
//將我們的二進(jìn)制數(shù)據(jù)字符串(“內(nèi)容”)插入到“圖像”列的表“表”中 mysql_query(“插入表(image)值('$ content')”);
}
在這里,我們打開文件進(jìn)行讀取并將圖像讀取到變量中。對該fread()的調(diào)用正在讀取圖像的字節(jié),因此我們?yōu)槠渲付藞D像文件的字節(jié)長度。可以使用“ size”鍵從$ _FILES數(shù)組中獲得。一旦將其包含在變量中,只需將其插入表中“ BLOB”類型的列中即可。在我們的示例中,“圖像”列是“ BLOB”數(shù)據(jù)類型。確保您在MySQL中選擇的BLOB也足夠大以容納數(shù)據(jù),因?yàn)镸ySQL確實(shí)具有不同大小的BLOB數(shù)據(jù)類型。
//讀取我們要從數(shù)據(jù)庫中提取的行。
$ result = mysql_query(“從ID = 1的表中選擇圖像”);
//如果成功,則以行的形式獲取該行,并將“ image”列中的數(shù)據(jù)存儲到變量中。如果($ result){
如果($ row = mysql_fetch_array($ result)){
$ img = $ row [“ image”];
}
}
//將此頁面的內(nèi)容類型設(shè)置為image / jpeg,因?yàn)槲覀円龅膱D像是jpg圖像。header(“ Content-type:image / jpeg”);
//回顯圖像。回顯“ $ img”;
在這里,我們使用行的ID查找所需的圖像。然后,我們從“圖像”列中提取數(shù)據(jù),并將其放入一個(gè)變量中,我們將在一秒鐘內(nèi)回顯該變量。在將頁面的標(biāo)題設(shè)置為image / jpeg的內(nèi)容類型之后,我們可以從變量中回顯二進(jìn)制數(shù)據(jù)。
現(xiàn)在請記住,
在header()調(diào)用之前無法打印任何內(nèi)容。如果這樣做,即使打印一個(gè)空格,它也會刷新標(biāo)題并在您嘗試再次調(diào)用header()時(shí)導(dǎo)致錯(cuò)誤。注意:錯(cuò)誤將與“標(biāo)題已發(fā)送”類似。
此過程與也具有Blob字段的其他數(shù)據(jù)庫非常相似。這里的想法是,我們要獲取一個(gè)二進(jìn)制對象,將其作為轉(zhuǎn)義的字符串插入,讀回并以告訴瀏覽器我們正在顯示圖像數(shù)據(jù)的內(nèi)容類型進(jìn)行顯示。
那么為什么我們不應(yīng)該將圖像存儲到這樣的數(shù)據(jù)庫中呢?數(shù)據(jù)庫(尤其是MySQL)非常適合快速查找數(shù)據(jù)和短數(shù)據(jù)塊。數(shù)據(jù)庫通常會獲取這些數(shù)據(jù)并將其分解為可快速在磁盤上定位的頁面。像BLOB這樣的大字段確實(shí)使數(shù)據(jù)庫膨脹,并且我們平時(shí)也會享受到了它的優(yōu)勢,例如在搜索中使用文件名。但!使用大量二進(jìn)制數(shù)據(jù)來膨脹數(shù)據(jù)庫可能會降低查詢速度,因?yàn)槿缓髷?shù)據(jù)庫被迫(可能)讀取2 GB的BLOB以便進(jìn)行顯示。所以當(dāng)然不能這么做。
解決方案:
將大型文件作為二進(jìn)制文件存儲在數(shù)據(jù)庫中,保持?jǐn)?shù)據(jù)庫的精簡并在數(shù)據(jù)庫中存儲文件的路徑.
可以將其視為指向?qū)ο蟮闹羔槨H绻枰@示圖像,則可以在數(shù)據(jù)庫中查找該字段,獲取文件路徑,然后使用該路徑從磁盤上定位圖片以進(jìn)行顯示。這給您帶來兩個(gè)好處:1、將數(shù)據(jù)庫必須管理的數(shù)據(jù)保持在最低限度(又稱其占用空間); 2、使用文件路徑,我們可以使用查詢來搜索它,以按文件名查找文件。
那么,為什么要有BLOB字段呢?如果您的圖像很小(例如圖標(biāo)),則該字段可能是一件好事。我也不建議在數(shù)據(jù)庫中使用大量圖標(biāo),但是可以在不引起過多性能噩夢的情況下使用一小塊二進(jìn)制數(shù)據(jù)。但是將數(shù)據(jù)庫留給文件系統(tǒng)管理簡單的快速數(shù)據(jù)片段和大文件。
總結(jié)
以上是生活随笔為你收集整理的php mysql 图像_将图像插入MySQL并使用PHP检索图像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30行python代码设计_30行Pyt
- 下一篇: 现在可以抄底格力电器了吗 还应该再谨慎一