<?php $up = new Upload(); $newPath = $up->uploadFile('fm'); if ($newPath === false) { var_dump($up->errorNumber); var_dump($up->errorInfo); } else { echo $newPath; } class Upload { //文件上传保存路径 protected $path = './upload/'; //允许文件上传的后缀 protected $allowSuffix = ['jpg', 'jpeg', 'gif', 'wbmp', 'png']; //允许文件上传的Mime类型 protected $allowMime = ['image/jpeg', 'image/gif', 'image/wbmp', 'image/png']; //允许文件上传的文件最大大小 protected $maxSize = 2000000; //是否启用随机名 protected $isRandName = true; //加上文件前缀 protected $prefix = 'up_'; //自定义的错误号码和错误信息 protected $errorNumber; protected $errorInfo; //文件的信息 protected $oldName; //文件名 protected $suffix; //文件后缀 protected $size; //文件大小 protected $mime; //文件mime protected $tmpName; //文件临时路径 protected $newName; //文件新名字 public function __construct($arr = []) { foreach ($arr as $key => $value) { $this->setOption($key, $value); } } public function __get($name) { if ($name == 'errorNumber') { return $this->errorNumber; } else if ($name == 'errorInfo') { return $this->getErrorInfo(); } } /** * 判断这个$key是不是我的成员属性,如果是,则设置 * * @param [type] $key * @param [type] $value * @return void */ protected function setOption($key, $value) { //得到所有的成员属性 $keys = array_keys(get_class_vars(__CLASS__)); if (in_array($key, $keys)) { $this->$key = $value; } } /** * 文件上传函数 * $key 就是你input框中的name属性值 * * @param [type] $key * @return void */ public function uploadFile($key) { //判断有没有设置路径 path if (empty($this->path)) { $this->setOption('errorNumber', -1); return false; } //判断该路径是否存在,是否可写 if (!$this->check()) { $this->setOption('errorNumber', -2); return false; } //判断$_FILES里面的error信息是否为0,如果为0,说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中 $error = $_FILES[$key]['error']; if ($error) { $this->setOption('errorNumber', $error); return false; } else { //提取文件相关信息并且保存到成员属性中 $this->getFileInfo($key); } //判断文件的大小、mime、后缀是否符合 if (!$this->checkSize() || !$this->checkMime() || !$this->checkSuffix()) { return false; } //得到新的文件名字 $this->newName = $this->createNewName(); //判断是否是上传文件,并且移动上传文件 if (is_uploaded_file($this->tmpName)) { if (move_uploaded_file($this->tmpName, $this->path . $this->newName)) { return $this->path . $this->newName; } else { $this->setOption('errorNumber', -7); return false; } } else { $this->setOption('errorNumber', -6); return false; } } /** * 得到文件的新名字 * * @return void */ protected function createNewName() { //判断是否使用随机名 if ($this->isRandName) { $name = $this->prefix . uniqid() . '.' . $this->suffix; } else { $name = $this->prefix . $this->oldName; } return $name; } /** * 判断该路径是否存在,是否可写 * * @return void */ protected function check() { //文件夹不存在或者不是目录。创建文件夹 if (!file_exists($this->path) || !is_dir($this->path)) { return mkdir($this->path, 0777, true); } //判断文件是否可写 if (!is_writeable($this->path)) { return chmod($this->path, 0777); } return true; } /** * 提取文件相关信息并且保存到成员属性中 * * @param [type] $key * @return void */ protected function getFileInfo($key) { // 得到文件名字 $this->oldName = $_FILES