PHP封装文件上传
(1)注意事项:
①创建表单时加上enctype="multipart/form-data",来提示浏览器不仅可以上传文本流,还能上传二进制流文件
②$_FILES接受上传文件信息,输出后如下
array(1) { ["pic"]=> array(5) { ["name"]=> string(36) "008ba1edbe4c0365a538b71189546615.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(53) "C:\Users\Administrator\AppData\Local\Temp\php4194.tmp" ["error"]=> int(0) ["size"]=> int(265610) } }
下面直接上代码,具体详解已经在代码注释过了。相关的函数可以参考文章 PHP常见函数
(2)代码解析
<meta charset="utf-8"> <?php abstract class aUpload{ public $allowExt = array('jpg','jpeg','png','rar'); public $maxSize = 1;//最大上传大小,以M为单位 public $error = '';//错误信息 /* * 分析$_FILES中$name的信息,比如_FILES中的['pic'] * @param string $name 表单中file表单项的name值 * @param array 上传文件的信息,包含(tmp_name,oname[不包含后缀的文件名],ext[后缀名],size) */ abstract public function getInfo($name); /* *创建目录,在当前网站的根目录中按年月日创建目录 *@return string 目录路径,例/upload/2015/0330 */ abstract public function createDir(); /* *生成随机文件名 *@param int $len 随机字符串的长度 *@return string 指定长度的随机字符串 */ abstract public function randStr($len=8); /* *上传文件 *@param string $name 表单中file表单项的name值 *@return string 上传文件的路径,从web根目录开始计,如/upload/2015/0330/a.jpg */ abstract public function up($name); /* 判断$_FILES[$name] 调用getInfo分析文件大小,后缀等 调用checkType 调用checkSize 调用creatDir 调用randStr生成随机文件名 移动,返回路径 */ /** 检测文件类型,如只允许jpg,png,rar,不允许exe *@param $ext 文件的后缀 *@return boolean */ abstract protected function checkType($ext); /* *检测文件的大小 *@param $size 文件的大小 *@return boolean */ abstract protected function checkSize($size); /* *读取错误信息 */ public function getError(){ return $this->error; } } class Upload extends aUpload{ //获取文件信息 public function getInfo($name){ // $_FILES接受的上传文件信息(数组),接受完毕后基本上上传完成。 //剩余步骤:检测安全性、起别名、缓存移动到硬盘等 return $_FILES[$name]; } //创建文件存储路径 public function createDir(){ date_default_timezone_set('PRC'); $dir = 'upload/'.date('Y/m',time()); if (!is_dir($dir)) { mkdir($dir,0777,true); } return $dir; } //生成随机字符串,用作文件名(检测文件不重复) public function randStr($len=8){ return md5(time()).mt_rand(10,100); } //检测文件类型,即后缀名(一般方式:截取后缀名进行判断,但不安全,因为后缀名可以随意改。若病毒改名.txt,则上传后可能会执行) //因为Linux环境下不检测后缀名。所以我们用$_FILES[files]进行检测 protected function checkType($ext){ return in_array($ext,$this->allowExt); } //获取传过来的文件大小,参数size为字节单位,需要转换 protected function checkSize($size){ return $size<$this->maxSize*1024*1024; } //上传 public function up($name){ if (!isset($_FILES[$name])) { die("上传为空"); } $info = $this->getInfo($name); $upfile = ltrim(strrchr($info['name'], '.'),'.');//后缀名 if (!$this->checkType($upfile)) { die("文件类型错误"); } if (!$this->checkSize($info['size'])){ die("文件过大,超出限制"); } //以上都符合后开始存到硬盘 $dir = $this->createDir();//路径 $filename = $this->randStr().'.'.$upfile;//文件名+后缀名 //$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称 if(move_uploaded_file($info['tmp_name'], $dir.'/'.$filename)){//返回文件路径和文件名 $data['path'] = $dir;//文件路径 $data['filename'] = $filename;//文件名 return $data; }else{ echo "上传失败"; } } } $file = new Upload(); $upload = $file->up('pic'); var_dump($upload);//返回数组,上传文件的文件名和路径 ?>
上传后返回数组:
array(2) { ["path"]=> string(14) "upload/2018/03" ["filename"]=> string(38) "250e8353fa1293d1e0f571317e28521f87.jpg" }
.