PHP上傳文件處理類(實例)

HTML

<code>/<code>


PHP

<code>require "FileUpload.class.php";
\t$up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt', 'doc', 'php', 'gif'),'FilePath'=>'./uploads/', 'MAXSIZE'=>200000));
\techo '
';
\tif($up->uploadFile('spic')){
\t\tprint_r($up->getNewFileName());
\t}else{
\t\tprint_r($up->getErrorMsg());\t
\t}
\techo '
';/<code>


Class 類文件

<code>\tclass FileUpload {
\t\tprivate $filepath; //指定上傳文件保存的路徑
\t\tprivate $allowtype=array('gif', 'jpg', 'png', 'jpeg'); //充許上傳文件的類型
\t\tprivate $maxsize=1000000; //允上傳文件的最大長度 1M
\t\tprivate $israndname=true; //是否隨機重命名, true false不隨機,使用原文件名
\t\tprivate $originName; //源文件名稱
\t\tprivate $tmpFileName; //臨時文件名
\t\tprivate $fileType; //文件類型
\t\tprivate $fileSize; //文件大小
\t\tprivate $newFileName; //新文件名
\t\tprivate $errorNum=0; //錯誤號
\t\tprivate $errorMess=""; //用來提供錯誤報告
\t\t//用於對上傳文件初使化
\t\t//1. 指定上傳路徑, 2,充許的類型, 3,限制大小, 4,是否使用隨機文件名稱

\t\t//讓用戶可以不用按位置傳參數,後面參數給值不用將前幾個參數也提供值
\t\tfunction __construct($options=array()){
\t\t\tforeach($options as $key=>$val){
\t\t\t\t$key=strtolower($key);
\t\t\t\t//查看用戶參數中數組的下標是否和成員屬性名相同
\t\t\t\tif(!in_array($key,get_class_vars(get_class($this)))){
\t\t\t\t\tcontinue;
\t\t\t\t}
\t\t\t\t$this->setOption($key, $val);
\t\t\t}
\t\t
\t\t
\t\t}
\t
\t\tprivate function getError(){
\t\t\t$str="上傳文件{$this->originName}/<font>時出錯:";
\t\t\tswitch($this->errorNum){
\t\t\t\tcase 4: $str .= "沒有文件被上傳"; break;
\t\t\t\tcase 3: $str .= "文件只被部分上傳"; break;
\t\t\t\tcase 2: $str .= "上傳文件超過了HTML表單中MAX_FILE_SIZE選項指定的值"; break;
\t\t\t\tcase 1: $str .= "上傳文件超過了php.ini 中upload_max_filesize選項的值"; break;
\t\t\t\tcase -1: $str .= "末充許的類型"; break;
\t\t\t\tcase -2: $str .= "文件過大,上傳文件不能超過{$this->maxSize}個字節"; break;
\t\t\t\tcase -3: $str .= "上傳失敗"; break;
\t\t\t\tcase -4: $str .= "建立存放上傳文件目錄失敗,請重新指定上傳目錄"; break;
\t\t\t\tcase -5: $str .= "必須指定上傳文件的路徑"; break;
\t\t\t\tdefault: $str .= "末知錯誤";
\t\t\t}
\t\t\treturn $str.'
';
\t\t}
\t
\t\t//用來檢查文件上傳路徑

\t\tprivate function checkFilePath(){
\t\t\tif(empty($this->filepath)) {
\t\t\t\t$this->setOption('errorNum', -5);
\t\t\t\treturn false;
\t\t\t}
\t\t\tif(!file_exists($this->filepath) || !is_writable($this->filepath)){
\t\t\t\tif(!@mkdir($this->filepath, 0755)){
\t\t\t\t\t$this->setOption('errorNum', -4);
\t\t\t\t\treturn false;
\t\t\t\t}
\t\t\t}
\t\t\treturn true;
\t\t}
\t\t//用來檢查文件上傳的大小
\t\tprivate function checkFileSize() {
\t\t\tif($this->fileSize > $this->maxsize){
\t\t\t\t$this->setOPtion('errorNum', '-2');
\t\t\t\treturn false;
\t\t\t}else{
\t\t\t\treturn true;
\t\t\t}
\t\t}
\t\t//用於檢查文件上傳類型
\t\tprivate function checkFileType() {
\t\t\tif(in_array(strtolower($this->fileType), $this->allowtype)) {
\t\t\t\treturn true;
\t\t\t}else{
\t\t\t\t$this->setOption('errorNum', -1);
\t\t\t\treturn false;
\t\t\t}
\t\t}
\t\t//設置上傳後的文件名稱
\t\tprivate function setNewFileName(){
\t\t\tif($this->israndname){
\t\t\t\t$this->setOption('newFileName', $this->proRandName());
\t\t\t} else {
\t\t\t\t$this->setOption('newFileName', $this->originName);
\t\t\t}
\t\t}
\t\t//設置隨機文件名稱
\t\tprivate function proRandName(){
\t\t\t$fileName=date("YmdHis").rand(100,999);
\t\t\treturn $fileName.'.'.$this->fileType;
\t\t}
\t
\t\tprivate function setOption($key, $val){
\t\t\t$this->$key=$val;

\t\t}
\t\t//用來上傳一個文件
\t\tfunction uploadFile($fileField){
\t\t\t$return=true;
\t\t\t//檢查文件上傳路徑
\t\t\tif(!$this->checkFilePath()){
\t\t\t\t$this->errorMess=$this->getError();
\t\t\t\treturn false;
\t\t\t}
\t\t\t
\t\t\t$name=$_FILES[$fileField]['name'];
\t\t\t$tmp_name=$_FILES[$fileField]['tmp_name'];
\t\t\t$size=$_FILES[$fileField]['size'];
\t\t\t$error=$_FILES[$fileField]['error'];
\t\t\tif(is_Array($name)){
\t\t\t\t$errors=array();
\t\t\t\tfor($i=0; $i<count>\t\t\t\t\tif($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
\t\t\t\t\t\tif(!$this->checkFileSize() || !$this->checkFileType()){
\t\t\t\t\t\t\t$errors[]=$this->getError();
\t\t\t\t\t\t\t$return=false;
\t\t\t\t\t\t}
\t\t\t\t\t}else{
\t\t\t\t\t\t$error[]=$this->getError();
\t\t\t\t\t\t$return=false;
\t\t\t\t\t}
\t\t\t\t\tif(!$return)
\t\t\t\t\t\t$this->setFiles();
\t\t\t\t}
\t\t\t\tif($return){
\t\t\t\t\t$fileNames=array();
\t\t\t\t\tfor($i=0; $i<count>\t\t\t\t\t\tif($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
\t\t\t\t\t\t\t$this->setNewFileName();
\t\t\t\t\t\t\tif(!$this->copyFile()){
\t\t\t\t\t\t\t\t$errors=$this->getError();
\t\t\t\t\t\t\t\t$return=false;
\t\t\t\t\t\t\t}else{
\t\t\t\t\t\t\t\t$fileNames[]=$this->newFileName;
\t\t\t\t\t\t\t}
\t\t\t\t\t\t}
\t\t\t\t\t}
\t\t\t\t\t$this->newFileName=$fileNames;
\t\t\t\t}
\t\t\t\t$this->errorMess=$errors;
\t\t\t\treturn $return;
\t\t\t} else {
\t\t\t\t
\t\t\t\t\tif($this->setFiles($name, $tmp_name, $size, $error)){
\t\t\t\t\t\tif($this->checkFileSize() && $this->checkFileType()){
\t\t\t\t\t\t\t$this->setNewFileName();

\t\t\t\t\t\t\tif($this->copyFile()){
\t\t\t\t\t\t\t\treturn true;
\t\t\t\t\t\t\t}else{
\t\t\t\t\t\t\t\t$return=false;
\t\t\t\t\t\t\t}
\t\t\t\t\t\t\t\t
\t\t\t\t\t\t}else{
\t\t\t\t\t\t\t$return=false;
\t\t\t\t\t\t}\t
\t\t\t\t\t}else{
\t\t\t\t\t\t$return=false;
\t\t\t\t\t}
\t\t\t\t\t
\t\t\t\t\t
\t\t\t\t\tif(!$return)
\t\t\t\t\t\t$this->errorMess=$this->getError();
\t\t\t\t\treturn $return;
\t\t\t}\t\t\t
\t\t}
\t\tprivate function copyFile(){
\t\t\tif(!$this->errorNum){
\t\t\t\t$filepath=rtrim($this->filepath, '/').'/';
\t\t\t\t$filepath.=$this->newFileName;
\t\t\t\tif(@move_uploaded_file($this->tmpFileName, $filepath))\t{
\t\t\t\t\treturn true;
\t\t\t\t}else{
\t\t\t\t\t$this->setOption('errorNum', -3);
\t\t\t\t\treturn false;
\t\t\t\t}
\t\t\t\t\t
\t\t\t}else{
\t\t\t\treturn false;
\t\t\t}
\t\t}
\t\t//設置和$_FILES有關的內容
\t\tprivate function setFiles($name="", $tmp_name='', $size=0, $error=0){
\t\t
\t\t\t$this->setOption('errorNum', $error);
\t\t\t\t
\t\t\tif($error){
\t\t\t\treturn false;
\t\t\t}
\t\t\t$this->setOption('originName', $name);
\t\t\t$this->setOption('tmpFileName', $tmp_name);
\t\t\t$arrStr=explode('.', $name);
\t\t\t$this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
\t\t\t$this->setOption('fileSize', $size);\t
\t\t\treturn true;
\t\t}\t
\t\t//用於獲取上傳後文件的文件名

\t\tfunction getNewFileName(){
\t\t\treturn $this->newFileName;
\t\t}
\t\t//上傳如果失敗,則調用這個方法,就可以查看錯誤報告
\t\tfunction getErrorMsg() {
\t\t\treturn $this->errorMess;
\t\t}
\t}
/<count>/<count>/<code>


PHP上傳文件處理類(實例)


分享到:


相關文章: