本來打算用在mysql里保存圖片的路徑,圖片存在文件夾里這種方法的,后來在網上查閱了一些資料,說mysql可以直接保存二進制的數據,數據類型是blob。
我們通常在數據庫中所使用的文本或整數類型的字段和需要用來保存圖片的字段的不同之處就在于兩者所需要保存的數據量不同。html' target='_blank'>MySQL數據庫使用專門的字段來保存大容量的數據,數據類型為BLOB。
MySQL數據庫為BLOB做出的定義如下:BLOB數據類型是一種大型的二進制對象,可以保存可變數量的數據。BLOB具有四種類型,分別是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,區別在于各自所能夠保存的最大數據長度不同。
然后就建立數據庫
CREATE TABLE ccs_image (id int(4) unsigned NOT NULL auto_increment,description varchar(250) default NULL,bin_data longblob,filename varchar(50) default NULL,filesize varchar(50) default NULL,filetype varchar(50) default NULL,PRIMARY KEY (id))
接著是上傳文件的頁面,upload.php,code如下:
Store binary data into SQL Database
// 如果提交了表單,代碼將被執行:if (isset($_POST['submit'])) {$form_description = $_POST['form_description'];$form_data_name = $_FILES['form_data']['name'];$form_data_size = $_FILES['form_data']['size'];$form_data_type = $_FILES['form_data']['type'];$form_data = $_FILES['form_data']['tmp_name'];//echo “winson”;// 連接到資料庫$connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);mysql_select_db( “test”) or die(“Unable to select database”);$data = addslashes(fread(fopen($form_data, “r”), filesize($form_data)));//echo “mysqlPicture=”.$data;$result=MYSQL_QUERY( “INSERT INTO ccs_image (description,bin_data,filename,filesize,filetype) VALUES (‘$form_description’,'$data’,'$form_data_name’,'$form_data_size’,'$form_data_type’)”);$id= mysql_insert_id();print “This file has the following Database ID: $id“;MYSQL_CLOSE();} else {// 否則顯示儲存新資料的表單?>
上文中的$_FILES['form_data']['name']; 等是獲取剛上傳來的文件的信息,php manual中有提到注: 要確保文件上傳表單的屬性是 enctype=”multipart/form-data”,否則文件上傳不了。全局變量 自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此數組包含有所有上傳的文件信息。以上范例中 數組的內容如下所示。我們假設文件上傳字段的名稱如上例所示,為 userfile。名稱可隨意命名。$_FILES['userfile']['name']客戶端機器文件的原名稱。www.it165.net$_FILES['userfile']['type']文件的 MIME 類型,如果瀏覽器提供此信息的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端并不檢查,因此不要想當然認為有這個值。$_FILES['userfile']['size']已上傳文件的大小,單位為字節。$_FILES['userfile']['tmp_name']文件被上傳后在服務端儲存的臨時文件名。$_FILES['userfile']['error']和該文件上傳相關的。此項目是在 PHP 4.2.0 版本中增加的。寫上面代碼時有個小波折,$data = addslashes(fread(fopen($form_data, “r”), filesize($form_data)));這句代碼是從網上找到的,我查了一下addslashes()的用法,php manual上提到默認情況下,PHP 指令 為 on,它主要是對所有的 GET、POST 和 COOKIE 數據自動運行 addslashes()。不要對已經被 轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數 進行檢測。我以為 已經on了,所以再把這個函數去掉,結果得不到數據,寫不進庫里,百思得其解,也許人家就是要雙層轉義的效果,我不加就剛好反了,我實在不懂圖片的編碼方面的知識。加上這個函數,果然得到想要的結果,高興。 然后是顯示圖片,getdata.php,code如下<?php if(isset($_GET['id'])) { $id = $_GET['id'];$connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);mysql_select_db( “test”) or die(“Unable to select database”);$query = “select bin_data,filetype from ccs_image where id=$id”; $result = @MYSQL_QUERY($query); $data = @MYSQL_RESULT($result,0, “bin_data”); $type = @MYSQL_RESULT($result,0, “filetype”); Header( “Content-type: $type”); echo $data; }?>這樣就算完成了,但這樣只是顯示單張圖片,想顯示多張行不行,答案是肯定的。編寫兩個文件。其中,第一個文件作為HTML頁面的模板,定位圖片的顯示位置。第二個文件則被用來從數據庫中實際輸出文件流,作為<IMG>標簽的SRC屬性。其實第二個文件就是getdata.php。第一個文件的代碼如下: <HTML> <BODY> <?php$connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);mysql_select_db( “test”) or die(“Unable to select database”);$result=mysql_query(“SELECT * FROM ccs_image”) or die(“Can’t Perform Query”);While ($row=mysql_fetch_object($result)){echo “<img src=/”show.php?id=”.$row->Id.”/”>winson<br>”;}?></BODY></HTML>鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答