2010年5月22日 星期六

上傳圖片到資料庫使用PHP

搭配MyySQL來建造一個上傳圖片的功能,但這篇不說明SQL部分的處理

首先先建立html表單如下:

<form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
//enctype 這個表單屬性讓表單使用特殊的編碼類別進行檔案上傳,影響POST時的打包及傳送
<input type="hidden" name="MAX_FILE_SIZE" value="32768" />
//建立檔案上傳容量限制(32KB)
<label for="name">Name:</label>
<input type="text" id="name" value="<?php if(!empty($name)) echo $name; ?>" />
<br />
<label for="score">Score:</label>
<input type="text" id="score" value="<?php if(!empty($score)) echo $score; ?>" />
<br />
<label for="screenshot">Screen shot:</label>
<input type="file" id="screenshot" name="screenshot" />
<hr />
<input type="submit" value="add" name="submit" />


接下來是獲得上傳檔案的名稱
這邊使用PHP的$_FILES超全域變數
他有以下幾個常用的用法
$_FILES['screenshot']['name']            //上傳檔案的名稱
$_FILES['screenshot']['type']             //上傳檔案的類別
$_FILES['screenshot']['size']              //上傳檔案的大小
$_FILES['screenshot']['tmp_name']    //伺服器上暫時性的檔案儲存位置
$_FILES['screenshot']['error']            //檔案上傳的錯誤碼;0表示成功,其他表示失敗

使用['name']建立在資料庫的欄位
儲存在外部檔案的資料比較好的應用方式是在資料庫裡儲存指向參考
假使儲存在資料庫中,則會面臨資料形態的轉換(2進制 -> 10進制)
讀取時又會面臨另外一次的資料形態轉換

注意一點,檔案上傳到伺服器後,會被儲存在暫時性的目錄
所以接下來要做的動作就是將檔案從暫時性的目錄搬到你想要放的位置
使用 move_upload_file($_FILES['screenshot']['temp_name'], $target) 函式
第一個參數前面說明過了,第二個參數放目標位置,包含路徑與檔案名稱

目標路徑的部分可以設置成常數,例如:
define('PIC_PATH','images/');
$target = PIC_PATH.time().$_FILES['screenshot']['name'];
//time()是用來增加獨特性,避免同檔名的檔案覆蓋
這樣一來萬一路徑有變就只需要改寫定義路徑(define)即可

當然在不同的頁面要使用共享的指令,例如這個路徑位置定義
使用include方法來處理
appvars.php============

<?php
//Define application constants
define('PIC_PATH','images/');
?>

在其他要使用的php頁面加上require_once('appvars.php'); 這行即可
require與include的差別在於發生錯誤時require會產生錯誤訊息,include則不會
視情況挑選自己想用的函式
PHP頁面中的DB部分設置如user、pw等常數也能這樣處理。

最後 is_file() 與  filesize() 這兩個函式也能幫助辨識檔案的存在與大小
以避免檔案不存在或建立0位元的空資料,可以好好利用
假使有檔案想刪除的話可以使用 @unlink() 函式
函式前面的@在檔案上傳實際上並不成功時可以抑制錯誤

沒有留言:

張貼留言