乙個經典的PHP檔案上傳類分享 使用心得

2021-07-28 14:21:11 字數 4371 閱讀 1956

一、需求分析

要球自定義檔案上傳類,即在使用非常簡便的前提下,又可以完成以下幾項功能:

①支援單個檔案上傳。

②支援多個檔案上傳。

③可以自己指定上傳檔案的儲存位置,可以設定上傳檔案允許的大小和型別,可以由系統對上傳檔案重新命名,又可以設定保留上傳檔案的原名。

(說明:要求單個檔案上傳和多個檔案上傳要採用同樣的操作方式,對上傳進行的一些設定也要採用相同的方式)。

二、程式設計

根據程式需求的要求,我們可以為檔案上傳類宣告4個可見的成員屬性,讓使用者在使用時還可以進行一些行為的設定。需要的成員屬性如下表所示:

為避免屬性的值被賦上一些非法值,需要將這些成員屬性封裝起來,在物件外面不能訪問,再通過類中宣告的set()方法為以上四個成員屬性賦值。set()方法有兩個引數,第乙個引數就是成員屬性名稱(不區分大小寫),第二個引數,就是前面引數中屬性對應的值。set()方法呼叫完成以後,返回本物件($this),所以除了可以單獨為每個屬性賦值以外,還可以進行連貫操作一起為多個屬性賦值。本例中除了set()方法以外,最主要的是實現上傳檔案的功能,所以系統主要提供了以下一些公有方法,實現檔案上傳的操作,如下表所示:

為避免屬性的值被賦上一些非法值,需要將這些成員屬性封裝起來,在物件外面不能訪問,再通過類中宣告的set()方法為以上四個成員屬性賦值。set()方法有兩個引數,第乙個引數就是成員屬性名稱(不區分大小寫),第二個引數,就是前面引數中屬性對應的值。set()方法呼叫完成以後,返回本物件($this),所以除了可以單獨為每個屬性賦值以外,還可以進行連貫操作一起為多個屬性賦值。本例中除了set()方法以外,最主要的是實現上傳檔案的功能,所以系統主要提供了以下一些公有方法,實現檔案上傳的操作,如下表所示:

<?php 

/** * created by phpstorm.

* user: zhang

* date: 2017/3/15

* time: 9:23

* file: fileupload.class.php 檔案上傳類fileupload

* 本類的例項物件用於處理上傳檔案,可以上傳乙個檔案,也可同時處理多個檔案上傳

*/class fileupload

return $this;

}/**

* 呼叫該方法上傳檔案

* @param string $filefile 上傳檔案的表單名稱

* @return bool 如果上傳成功返回數true

*/function upload($filefield)

/* 將檔案上傳的資訊取出賦給變數 */

$name =$filefield['file']['name'];

$tmp_name = $filefield['file']['tmp_name'];

$size = $filefield['file']['size'];

$error = $filefield['file']['error'];

/* 如果是多個檔案上傳則$file["name"]會是乙個陣列 */

if (is_array($name))

} else

/* 如果有問題,則重新初使化屬性 */

if (!$return)

$this->setfiles();

}if ($return)

$filenames = $this->newfilename;}}

$this->newfilename = $filenames;

}$this->errormess = $errors;

return $return;

/*上傳單個檔案處理方法*/

} else else

} else

} else

//如果$return為false, 則出錯,將錯誤資訊儲存在屬性errormess中

if (!$return)

$this->errormess = $this->geterror();

return $return;}}

/*** 獲取上傳後的檔名稱

* @param void 沒有引數

* @return string 上傳後,新檔案的名稱, 如果是多檔案上傳返回陣列

*/public function getfilename()

/*** 上傳失敗後,呼叫該方法則返回,上傳出錯資訊

* @param void 沒有引數

* @return string 返回上傳檔案出錯的資訊報告,如果是多檔案上傳返回陣列

*/public function geterrormsg()

/* 設定上傳出錯資訊 */

private function geterror()

時出錯 : ";

switch ($this->errornum) 個位元組";

break;

case -3:

$str .= "上傳失敗";

break;

case -4:

$str .= "建立存放上傳檔案目錄失敗,請重新指定上傳目錄";

break;

case -5:

$str .= "必須指定上傳檔案的路徑";

break;

default:

$str .= "未知錯誤";

}return $str . '

'; }

/* 設定和$_files有關的內容 */

private function setfiles($name = "", $tmp_name = "", $size = 0, $error = 0)

/* 為單個成員屬性設定值 */

private function setoption($key, $val)

/* 設定上傳後的檔名稱 */

private function setnewfilename()

else

}/* 檢查上傳的檔案是否是合法的型別 */

private function checkfiletype()

else

}/* 檢查上傳的檔案是否是允許的大小 */

private function checkfilesize()

else

}/* 檢查是否有存放上傳檔案的目錄 */

private function checkfilepath()

if (!file_exists($this->path) || !is_writable($this->path))

}return true;

}/* 設定隨機檔名 */

private function prorandname()

/* 複製上傳檔案到指定的位置 */

private function copyfile()

else

} else

}}?>

四、檔案上傳類的應用過程本例的檔案上傳類fileupload,即支援單檔案上傳,也支援多個檔案一起向伺服器上傳,在處理方式上沒有區別的,只不過在編寫上傳標單時,多個檔案上傳一定要以陣列方式傳遞給伺服器。單個檔案上傳表單如下所示:

上面表單,都將提交的位置指向了同乙個檔案upload.php,所以不難看出單個和多個檔案上傳是一樣的處理方式,upload.php**如下所示:

<?php 

//包含乙個檔案上傳類中的上傳類

include "fileupload.class.php";

$up = new fileupload;

//設定屬性(上傳的位置, 大小, 型別, 名是是否要隨機生成)

//使用物件中的upload方法, 就可以上傳檔案, 方法需要傳乙個上傳表單的名子 pic, 如果成功返回true, 失敗返回false

if($up -> upload("pic")) else

?>

**

乙個完整的php檔案上傳類例項講解

php define no file 不存在上傳檔案 define not allow ext 檔案型別不在允許範圍內 define not allow size 檔案大小不在允許範圍內 define has the file 該檔案已經存在 define upload failed 上傳失敗 de...

PHP中的乙個很好用的檔案上傳類

class fileupload else 定義不同的錯誤級別 private function geterror 時出錯 switch this errornum 個位元組 break case 3 str.上傳失敗 break case 4 str.建立存放上傳目錄失敗,請重新指定上傳目錄 br...

PHP中的乙個很好用的檔案上傳類

class fileupload else 定義不同的錯誤級別 private function geterror 時出錯 switch this errornum 個位元組 break case 3 str.上傳失敗 break case 4 str.建立存放上傳目錄失敗,請重新指定上傳目錄 br...