🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
~~~ <?php /** * 上传工具类,单文件直接实列化请求UploadFile,多文件请求uploadMulti * 同时提供了一些对外界修改参数的函数 */ class Upload { private $_error; // 存储当前错误信息 private $_upload_path; // 上传目录 private $_prefix; // 前缀 private $_max_size; // 最大size private $_ext_list; // 允许的后缀列表 private $_mime_list; // 允许的MIME列表 private $_ext_mime = array( // 图片对应的MIME表 '.jpeg' => 'image/jpeg', '.jpg' => 'image/jpeg', '.png' => 'image/png', '.gif' => 'image/gif' ); public function __construct() { // 为选项指定默认值 $this->_error = array(); $this->_upload_path = './'; $this->_prefix = ''; $this->_max_size = 5 * 1024 * 1024; $this->_ext_list = array('.jpg', '.gif', '.png', '.jpeg'); $this->_setMIMEList($this->_ext_list); } /** * 通过允许的后缀列表获得相对应允许的MIME列表 * @param string $ext_list 允许的后缀列表 * @return void 赋值到 MIME列表属性上 */ private function _setMIMEList($ext_list) { $mime_list = array(); // 遍历获得每一个后缀名 foreach($ext_list as $ext) { // 利用当前后缀名,获取对应的MIME,存储到MIME列表中! $mime_list[] = $this->_ext_mime[$ext]; } // 赋值到 MIME列表属性上! $this->_mime_list = $mime_list; } //下面的提供修改这些配置属性的方法:setUploadPath setPrefix setMaxSize setExtList /** * 提供修改路径的方法 * @access public * @param string $upload 目录字符串 默认'./' * @return void 目录不存在采用默认,存在采用传入的参数 */ public function setUploadPath($upload_path) { // 不允许将不存在的目录设置为上传目录 if (is_dir($upload_path)) { $this->_upload_path = $upload_path; } else { trigger_error('上传目录设置失败,采用默认'); } } /** * 提供修改前缀的方法 * @access public * @param string $prefix 默认'' * @return void 把传入的前缀保存到_prefix */ public function setPrefix($prefix) { $this->_prefix = $prefix; } /** * 提供修改最大大小的方法 * @access public * @param int $max_size 最大大小 默认1*1024*1024 * @return void 将传入的尺寸保存到_max_size */ public function setMaxSize($max_size) { $this->_max_size = $max_size; } /** * 提供修改允许的后缀名列表 * @param array $ext_list 后缀名组成的数组,默认array('.jpg', '.gif', '.png', '.jpeg'); * @return void 将传入的数组保存到_ext_list,并调用_setMIMEList方法生成对应的MIME类型 */ public function setExtList($ext_list) { $this->_ext_list = $ext_list; $this->_setMIMEList($ext_list); } /** * 文件上传(业务逻辑判断)函数 * 一次上传(判断)一个文件 * @param array $file_info 某个临时上传文件的5个信息,由$_FILES中获得! * @return string:成功,目标文件名;false: 失败 */ public function uploadFile($file_info) { // 判断是否有错误 if ($file_info['error'] != 0) { $this->_error[] = '上传文件存在错误'; return false; } // 判断文件类型 // 后缀名 $ext_list = $this->_ext_list; // 允许的后缀名列表 $ext = strrchr($file_info['name'], '.'); if (! in_array($ext, $ext_list)) { $this->_error[] = '类型,后缀不合法'; return false; } // MIME $mime_list = $this->_mime_list; // 允许的mime列表! if (! in_array($file_info['type'], $mime_list)) { $this->_error[] = '类型,MIME不合法'; return false; } // PHP检测MIME $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($file_info['tmp_name']); if (! in_array($mime_type, $mime_list)) { $this->_error[] = '类型,PHP检测MIME不合法'; return false; } // 判断大小 $max_size = $this->_max_size; // 允许的最大尺寸 if ($file_info['size'] > $max_size) { $this->_error[] = '文件过大'; return false; } // 设置目标文件地址 // 上传目录 $upload_path = $this->_upload_path; // 采用子目录存储 // 获取当前需要的子目录名(目录/小时) $sub_dir = date('YmdH') . '/'; // 当前的年月日时 // 是否存在 if (! is_dir($upload_path . $sub_dir)) { // 不存在,创建 mkdir($upload_path . $sub_dir); } // 目标文件名 $prefix = $this->_prefix;// 前缀 $dst_name = uniqid($prefix, true) . $ext; // 是否为HTTP上传文件的检测 if (! is_uploaded_file($file_info['tmp_name'])) { $this->_error = '不是HTTP上传的临时文件'; return false; } // 移动! if (move_uploaded_file($file_info['tmp_name'], $upload_path . $sub_dir . $dst_name)) { // 移动成功 return $sub_dir . $dst_name; // 仅仅返回 上传目录之后的地址即可! } else { $this->_error = '移动失败'; return false; } } /** * 获取错误信息 * @access public * @return string 错误信息 */ public function getError() { return $this->_error; } //示范多文件上传处理,name相同的情况 //$arrFile = array(); //$i=0; //foreach($file as $key=>$value){ 二维数组 // foreach($value as $val){ 一维数组 // $arrFile[$i++][$key] = $val; // } // $i = 0; //} //name 取出每个名字 $arr[0~3][name] //type 取出每个类型 $arr[0~3][type] //tmp_name 取出每个上传的位置 $arr[0~3][tmp_name] //error 取出每个错误信息 $arr[0~3][error] //size 取出每个大小 $arr[0~3][size] /** * 上传文件判断函数,多文件上传,name值不同 * @param array $file_list 比如:$_FILES['image'] 二维数组 * @return 返回上传目录之后的地址结果 */ function uploadMulti($file_list) { // 遍历,其中的name元素,得到下标,下面看不懂看177-189 foreach($file_list['name'] as $key=>$v) { //传进来的$file_list是二维数组 // 利用下标 获得对应的5个元素值 // $file_info每个文件的信息,$key是0开始的整数 $file_info['name'] = $file_list['name'][$key]; $file_info['type'] = $file_list['type'][$key]; $file_info['tmp_name'] = $file_list['tmp_name'][$key]; $file_info['error'] = $file_list['error'][$key]; $file_info['size'] = $file_list['size'][$key]; // 上传该文件即可! // 并存储每个文件的上传结果,与$key对应! $result_list[$key] = $this->uploadFile($file_info); } // 返回上传结果 return $result_list; } } ~~~