引 言
在 Web 應用程序開發中,通常文件上傳是不可缺少的功能.用戶可以根據各種需求將文檔資料或圖像視頻等資料上傳到 Web 服務器.由于上傳文件的類型、大小及編碼方式的不同,開發者在設計上傳模塊時必須考慮到各種可能出現的問題.當客戶端使用 HTTP 協議進行文件上傳,文件上傳過程是比較復雜的.根據網站上傳文件的各種需求,開發為實現這些功能的類可以有效地解決文件上傳問題.
1 文件上傳過程介紹與配置文件設置
本 文 使 用 的 開 發 環 境 為 Wndows+A-pache+MySQL+PHP.PHP 可以實現多種瀏覽器上傳文件.文件上傳的過程其實就是一個文件復制的過程,客戶端通過 HTTP 協議以 POST 方式將表單提交給服務器后,上傳的文件被放置在臨時目錄里,服務器端腳本對文件進行進一步處理,一般是要將文件從臨時目錄移動到指定的目錄中,需要使用函數move_uploaded_file 移動提交的文件,進而完成整個文件上傳過程.
配置文件 php.ini 中設置參數如下
file_uploads :設為 On,允許通過 HTTP 上傳文件upload_tmp_dir :文件上傳至服務器時用于臨時存儲的目錄,如果沒指定,系統會使用默認的臨時文件夾.
upload_max_filesize :允許上傳文件大小的最大值,默認情況下 PHP 上傳文件大小為 2 M,用戶需要上傳大于 2 M 的文件,但是利用 HTTP 協議又不能上傳太大的文件,因此,需要適當修改相關參數.
upload_max_filesize 設置數值可以大于 2 M,即允許上傳文件的最大值可以大于默認的 2 M.
post_max_size:PHP 可接收的 post 數據的最大值,該值應大于允許上傳文件大小的最大值.設置post_max_size 數值可以大于 8 M,8 M 通常是通過表單 POST 給 PHP 的所能接收的最大值,包括表單里的所有值.
memory_limit:腳本所占的最大內存數,該值要大于允許上傳的文件大小.
max_execution_time:腳本運行的最長時間\\(s\\),默認 30 S.
2 實現文件上傳的類
定義一個上傳類 upload,其構造函數如下.
function __construct \\($fileArr, $savename, $savepath,
$fileformat, $overwrite = 0,$maxsize = 0\\) {
$this->file = $fileArr['file'];
$this->file_name = $fileArr['name'];
$this->file_size = $fileArr['size'];
$this->file_type = $fileArr['type'];
$this->get_ext\\(\\);
$this->set_savepath\\($savepath\\);
$this->set_fileformat\\($fileformat\\);
$this->set_overwrite\\($overwrite\\);
$this->set_savename\\($savename\\);
$this->set_maxsize\\($maxsize\\);
}
在構造函數中,參數$fileArr 為文件數組,name為上傳文件名,size 為上傳文件大小,type 為上傳文件類型,參數 savename 為文件保存名,參數 savepath 為文件保存路徑,參數 fileformat 為文件格式,參數 over-write 指是否覆蓋文件,參數 maxsize 為文件最大值.
接下來運行的程序要檢查文件格式、檢查目錄是否可寫入文件、檢查文件是否已經存在、檢查文件大小是否超過限制,然后使用 move_uploaded_file 函數上傳文件,代碼如下.
if \\(!$this->validate_format\\(\\)\\)
{
$this->errno = 1;
return false;
}
if\\(!@is_writable\\($this->savepath\\)\\)
{
$this->errno = 2;
return false;
}
if \\($this->overwrite == 0 && @file_exists\\($th-
is->savepath.$this->savename\\)\\)
{
$this->errno = 3;
return false;
}
if \\($this->maxsize != 0 \\)
{
if \\($this->file_size > $this->maxsize\\)
{
$this->errno = 5;
return false;
}
}
if \\(!move_uploaded_file \\($this->file, $th-
is->savepath.$this->savename\\)\\)
{
$this->errno = 4;
return false;
}
3 文件上傳解決方案
為了實現文件的上傳,在
客戶端與服務器通信使用超文本傳輸協議,服務器端接收客戶端 POST 方法提交的數據,通過 PHP腳本語言取得文件數組,設置允許上傳的文件類型、文件上傳目錄,然后創建類 upload 的對象,執行構造函數,進行各種檢查,運行文件上傳的程序段以實現文件的上傳,最后釋放對象.
include_once "upload.class.php";
if \\($_POST[add]==" 上傳 "\\){
$fileArr['file'] = $myupfile;
$fileArr['name'] = $myupfile_name;
$fileArr['size'] = $myupfile_size;
$fileArr['type'] = $myupfile_type;
echo $file;
echo $file_name;
$filetypes = array \\('gif','jpg','jpge','png','doc'\\); // 所允許上
傳的文件類型
$savepath = "upload/"; // 文件上傳目錄
$maxsize = 0;
$overwrite = 0;
$upload = new upload \\($fileArr, $myupfile_name,
$savepath, $filetypes, $overwrite, $maxsize\\);
if \\(!$upload->run\\(\\)\\)
{
echo $upload->errmsg\\(\\);
}
}
?>
4 結 論
本文設計的文件上傳類的特點是:可以對文件上傳進行控制,利用類創建的對象及其方法可以獲得全部上傳文件的信息,文件上傳類使用方便;可以定制上傳文件的大小、類型等.本文實現的文件上傳類可以支持多文件上傳、減低開發難度、節省開發時間,有效地實現文件的上傳.
參考文獻:
[1] Welling L,Thomson L.PHP 和 MySQL Web 開發[M].北京:清華大學出版社,2009.
[2] 張恩民.PHP 開發實戰權威指南[M].北京:清華大學出版社,2012.
[3] 蘇貴斌,馬季骕.使用 JavaBeans 組件實現文件上傳[J].內蒙古師范大學學報,2004\\(4\\):400-403.
[4] 李 斌.PHP 開發環境下文件上傳的原理與實現[J].電腦開發與應用,2013\\(10\\):30-32.