PHP通用文件上传类的具体解析

开发 后端
PHP通用文件上传类的实质就是用到PHP组文件上传,在具体的编写代码过程中,要特别注意的是name后面必须要加上[],方便我们调用层循环。

我们下面为大家具体讲解PHP通用文件上传类的具体代码编写,希望初学者能够通过本文学到一些新的知识,增加自己的编程实践经验。由于做项目中经常遇到文件上传,因此封装了一个通用的文件上传类,作用支持组文件上传,并且不同的上传域可以上传不同的文件类型,不同的文件类型限制的文件大小也可能不相同。

#t#举例来说:用户可上传一种展品并可为该展品上传一张缩略图,那么缩略图文件限制类型可能为jpg,,gif,png等,而展品文件限制类型可能为mov,avi,mpeg等,而图片大小可能限制为100KB,音频视频大小可能限制为2MB。类代码如下:

  1. class Upload  
  2. {  
  3.     public $InputName;    // 文件上传域控件名  
  4.       
  5.     /**    
  6.     * 允许上传的文件类型  
  7.     * 形式为 array('image/jpeg', 'image/png', 'image/gif') 或包含此类数组的数组(与每个上传域控件对应)  
  8.     */  
  9.     public $FileType;  
  10.       
  11.     /**    
  12.     * 最大上传文件大小(单位:byte)  
  13.     * 形式为 array('image' => $size, 'audio' => $size)(表示每种应用文件类型所对应的上传大小) 或包含此类数组的数组(与每个上传域控件对应)或一数值(表示所有上传文件均限制在此大小之下)  
  14.     */  
  15.     public $FileMaxSize;   
  16.       
  17.     public $FileSavePath;  // 文件保存路径(可为数组形式,表示不同上传域上传文件到不同的路径)  
  18.     public $FileSaveName;  // 文件保存名(不包含后缀名)(可为数组形式,表示不同上传域上传文件保存的不同名称)  
  19.     public $NoteFileFalse; // 文件错误提示  
  20.     public $NoteFileType;  // 文件类型不符提示  
  21.     public $NoteFileSize;  // 文件大小超出提示  
  22.       
  23.     /* 上传文件并返回文件名信息(包含后缀名) */  
  24.     public function UploadFile()  
  25.     {  
  26.         $this->CheckFile(); // 检验文件  
  27.         $file = $_FILES[$this->InputName];  
  28.         $file_save_full_name = array(); // 文件保存名(包含后缀名)  
  29.           
  30.         foreach ($file['name'] as $key => $name)  
  31.         {  
  32.             if (!empty($name)) // 文件不为空  
  33.             {  
  34.                 /* 确定文件保存路径 */  
  35.                 if (is_array($this->FileSavePath))  
  36.                 {  
  37.                     $file_save_path = $this->FileSavePath[$key];  
  38.                 }  
  39.                 else   
  40.                 {  
  41.                     $file_save_path = $this->FileSavePath;  
  42.                 }  
  43.                   
  44.                 /* 确定文件保存名(不包含后缀名) */  
  45.                 if (is_array($this->FileSaveName))  
  46.                 {  
  47.                     $file_save_name = $this->FileSaveName[$key];  
  48.                 }  
  49.                 else   
  50.                 {  
  51.                     $file_save_name = $this->FileSaveName;  
  52.                 }  
  53.                   
  54.                 /* 开始保存 */  
  55.                 $this->CreatePath($file_save_path); // 如果路径不存在则创建路径  
  56.                 move_uploaded_file($file["tmp_name"][$key], $file_save_path . $file_save_name . $this->GetSuffix($file['name'][$key]));  
  57.                 $file_save_full_name[] = $file_save_name . $this->GetSuffix($file['name'][$key]);  
  58.             }  
  59.             else   
  60.             {  
  61.                 $file_save_full_name[] = null;  
  62.             }  
  63.         }  
  64.           
  65.         unlink($file);  
  66.           
  67.         /* 如果只有一个文件,则返回单个文件名 */  
  68.         if (count($file_save_full_name) == 1)  
  69.         {  
  70.             $file_save_full_name = $file_save_full_name[0];  
  71.         }  
  72.           
  73.         return $file_save_full_name;  
  74.     }  
  75.       
  76.     /* 检验文件 */  
  77.     private function CheckFile()  
  78.     {  
  79.         $file = $_FILES[$this->InputName];  
  80.           
  81.         foreach ($file['name'] as $key => $name)  
  82.         {  
  83.             if (!empty($name)) // 文件不为空  
  84.             {  
  85.                 $type  = $file['type'][$key];  
  86.                 $size  = $file['size'][$key];  
  87.                 $error = $file['error'][$key];  
  88.                   
  89.                 /* 确定允许上传文件类型列表 */  
  90.                 if (is_array($this->FileType[0]))  
  91.                 {  
  92.                     $file_type = $this->FileType[$key];  
  93.                 }  
  94.                 else   
  95.                 {  
  96.                     $file_type = $this->FileType;  
  97.                 }  
  98.                   
  99.                 /* 确定最大上传文件大小 */  
  100.                 if (is_array($this->FileMaxSize))  
  101.                 {  
  102.                     $file_max_size_key = explode('/', $type);  
  103.                     $file_max_size_key = $file_max_size_key[0];  
  104.                     if (is_array($this->FileMaxSize[0]))  
  105.                     {  
  106.                         $file_max_size = $this->FileMaxSize[$key][$file_max_size_key];  
  107.                     }  
  108.                     else   
  109.                     {  
  110.                         $file_max_size = $this->FileMaxSize[$file_max_size_key];  
  111.                     }  
  112.                 }  
  113.                 else   
  114.                 {  
  115.                     $file_max_size = $this->FileMaxSize;  
  116.                 }  
  117.                   
  118.                 /* 文件错误 */  
  119.                 if ($error > 0)  
  120.                 {  
  121.                     die($name . $this->NoteFileFalse);  
  122.                 }  
  123.                   
  124.                 /* 文件大小超过最大上传文件大小 */  
  125.                 if ((!is_null($file_max_size) && $size > $file_max_size) || ($size == 0))  
  126.                 {  
  127.                     die($name . $this->NoteFileSize);  
  128.                 }  
  129.  
  130.                     /* 文件类型不符 */  
  131.                 if (!in_array($type, $file_type))  
  132.                 {  
  133.                     die($name . $this->NoteFileType);  
  134.                 }  
  135.             }  
  136.         }  
  137.     }  
  138.       
  139.     /* 获取文件后缀名 */  
  140.     private function GetSuffix($fileName)  
  141.     {  
  142.         return substr($fileName, strrpos($fileName, "."));  
  143.     }  
  144.  
  145.     /* 如果路径不存在则创建路径 */  
  146.     private function CreatePath($filePath)  
  147.     {  
  148.         if (!file_exists($filePath))  
  149.         {  
  150.             mkdir($filePath);  
  151.         }  
  152.     }  

PHP通用文件上传类的使用方法:接着以本文开头所举例子来说明该类的调用方法(呵呵,调用是很方便的):

$upload_obj = new Upload(); // 文件上传对象

$upload_obj->InputName = 'upload_test'; // 文件上传域控件名

$upload_obj->FileType = array(array('image/jpeg', 'image/png'), array('audio/mpeg', 'video/x-msvideo')); // 允许上传的文件类型

$upload_obj->FileMaxSize = array('image' => 100 * 1024, 'audio' => 2 * 1024 * 1024, 'video' => 2 * 1024 * 1024);

$upload_obj->FileSavePath = array('upload/files/s/', 'upload/files/z/');

$upload_obj->FileSaveName = time();

$upload_obj->NoteFileFalse = '文件错误';

$upload_obj->NoteFileType  = '文件类型不符';

$upload_obj->NoteFileSize  = '文件大小超出';

$file_save_full_name = $upload_obj->UploadFile(); // 上传并获取文件全名(基本名加扩展名)(如果是多个文件则为数组形式)(全名用于在数据库中存储信息)

总结:就此可轻松实现若干文件上传,其实PHP通用文件上传类归根结底用到了PHP组文件上传,要注意的就是控件名的name后别忘了加上[],这样的好处就是遇到多个文件上传时就不用在调用层进行循环或一个一个处理上传了,我们的应用也因此而轻松。

责任编辑:曹凯 来源: CSDN
相关推荐

2009-11-24 15:50:09

PHP上传类uploa

2009-11-24 14:52:45

PHP动态多文件上传

2009-11-24 15:23:50

PHP文件上传进度条

2009-12-04 17:06:47

PHP读取Excel文

2009-11-24 14:32:03

PHP限制上传文件大小

2009-11-27 15:31:33

PHP类搜索定位目录树

2009-11-24 14:45:08

PHP批量上传图片

2009-11-30 16:08:32

PHP addslas

2009-12-01 19:08:18

PHP外部变量

2009-11-16 14:09:30

PHP上传类

2009-12-02 18:51:12

PHP分页类

2009-11-24 14:22:03

基于PHP的AJAX技

2009-11-25 10:02:27

PHP会话Sessio

2009-11-16 10:40:02

PHP上传文件代码

2009-11-25 15:26:03

PHP中反馈表单

2009-11-25 14:00:37

PHP函数asort(

2009-11-16 10:49:43

PHP上传文件代码

2009-11-16 09:35:42

PHP上传

2009-11-16 11:41:19

PHP上传大文件

2009-05-18 10:23:43

文件上传PHPFILE函数
点赞
收藏

51CTO技术栈公众号