php上傳圖片到mysql並顯示

mysql能夠直接保存二進制的數據,數據類型是blob。

  一般在數據庫中所使用的文本或整數類型的字段和須要用來保存圖片的字段的不一樣之    
處就在於二者所須要保存的數據量不一樣。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)
)
php

接着是上傳文件的頁面,upload.php,code以下:
html

<HTML> 
<HEAD><TITLE>Store binary data into SQL Database</TITLE></HEAD> 
<BODY> 

<?php 


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']; 
 
$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 "<p>This file has the following Database ID: <a href='getdata.php?id=$id'><b>$id</b></a>";


MYSQL_CLOSE();

} else { 

?> 
 <center>
<form method="post" action="http://localhost/temp/1018/upload.php" enctype="multipart/form-data"> 
File Description: 
<input type="text" name="form_description" size="40"> 
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000000"> <br> 
File to upload/store in database: 
<input type="file" name="form_data" size="40"> 
<p><input type="submit" name="submit" value="submit"> 
</form> 
 </center>

<?php 

} 

?> 
</BODY> 
</HTML>
上文中的 $_FILES['form_data']['name']; 等是獲取剛上傳來的文件的信息,php manual中有提到

注: 要確保文件上傳表單的屬性是 enctype="multipart/form-data",不然文件上傳不了。 mysql

全局變量 $_FILES 自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此數組包含有全部上傳的文件信息。 sql

以上範例中 $_FILES 數組的內容以下所示。咱們假設文件上傳字段的名稱如上例所示,爲 userfile。名稱可隨意命名。 數據庫

$_FILES['userfile']['name']

客戶端機器文件的原名稱。 數組

$_FILES['userfile']['type']

文件的 MIME 類型,若是瀏覽器提供此信息的話。一個例子是「image/gif」。不過此 MIME 類型在 PHP 端並不檢查,所以不要想固然認爲有這個值。 瀏覽器

$_FILES['userfile']['size']

已上傳文件的大小,單位爲字節。 函數

$_FILES['userfile']['tmp_name']

文件被上傳後在服務端儲存的臨時文件名。 post

$_FILES['userfile']['error']

和該文件上傳相關的錯誤代碼。此項目是在 PHP 4.2.0 版本中增長的。fetch

$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

默認狀況下,PHP 指令 magic_quotes_gpc 爲 on,它主要是對全部的 GET、POST 和 COOKIE 數據自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),由於這樣會致使雙層轉義。遇到這種狀況時可使用函數 get_magic_quotes_gpc() 進行檢測。

顯示圖片,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>
最後提醒一點,header()函數使用前必定不能有任何輸出,就算"<?php"前有個空格都不行!
相關文章
相關標籤/搜索