标签:thinkphp5
/** * 检测上传文件 * @param array $rule 验证规则 * @return bool */ public function check($rule = []) {// 检测 上传 文件 $rule = $rule ?: $this->validate;// rule 规则 获取 /* 检查文件大小 */ if (isset($rule[‘size‘]) && !$this->checkSize($rule[‘size‘])) {// 文件大小 $this->error = ‘上传文件大小不符!‘; return false; } /* 检查文件Mime类型 */ if (isset($rule[‘type‘]) && !$this->checkMime($rule[‘type‘])) {// 文件类型 $this->error = ‘上传文件MIME类型不允许!‘; return false; } /* 检查文件后缀 */ if (isset($rule[‘ext‘]) && !$this->checkExt($rule[‘ext‘])) {// 文件后缀 $this->error = ‘上传文件后缀不允许‘; return false; } /* 检查图像文件 */ if (!$this->checkImg()){ // 是否为图片 $this->error = ‘非法图像文件!‘; return false; } return true; } /** * 检测上传文件后缀 * @param array|string $ext 允许后缀 * @return bool */ public function checkExt($ext) { if (is_string($ext)) { $ext = explode(‘,‘, $ext);// 获取许可文件 后缀 } $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION)); if (!in_array($extension, $ext)) {// 判断是否存在 许可范围内 return false; } return true; } /** * 检测图像文件 * @return bool */ public function checkImg()// 图片检测 { $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION)); /* 对图像文件进行严格检测 */ if (in_array($extension, [‘gif‘, ‘jpg‘, ‘jpeg‘, ‘bmp‘, ‘png‘, ‘swf‘]) && !in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6])) { return false; } return true; } // 判断图像类型 protected function getImageType($image)// 图片类型检测 { if (function_exists(‘exif_imagetype‘)) { return exif_imagetype($image); } else { $info = getimagesize($image); return $info[2]; } } /** * 检测上传文件大小 * @param integer $size 最大大小 * @return bool */ public function checkSize($size) { if ($this->getSize() > $size) {// 文件大小 return false; } return true; } /** * 检测上传文件类型 * @param array|string $mime 允许类型 * @return bool */ public function checkMime($mime) { if (is_string($mime)) { $mime = explode(‘,‘, $mime); } if (!in_array(strtolower($this->getMime()), $mime)) {// 文件类型 许可 return false; } return true; } /** * 移动文件 * @param string $path 保存路径 * @param string|bool $savename 保存的文件名 默认自动生成 * @param boolean $replace 同名文件是否覆盖 * @return false|SplFileInfo false-失败 否则返回SplFileInfo实例 */ public function move($path, $savename = true, $replace = true) {// 保存 路径 报错名字 // 文件上传失败,捕获错误代码 if (!empty($this->info[‘error‘])) {// 捕获 错误信息代码 $this->error($this->info[‘error‘]); return false; } // 检测合法性 if (!$this->isValid()) {// 合法性 $this->error = ‘非法上传文件‘; return false; } // 验证上传 if (!$this->check()) {// 验证上传 return false; } $path = rtrim($path, DS) . DS;// 删除 右侧 分隔符 // 文件保存命名规则 $saveName = $this->buildSaveName($savename);// 获取 保存的文件名 $filename = $path . $saveName;// 生成文件名称 // 检测目录 if (false === $this->checkPath(dirname($filename))) {// 检测 目录 return false; } /* 不覆盖同名文件 */ if (!$replace && is_file($filename)) {// 同名文件 覆盖 $this->error = ‘存在同名文件‘ . $filename; return false; } /* 移动文件 */ if ($this->isTest) { rename($this->filename, $filename);// 移动文件 } elseif (!move_uploaded_file($this->filename, $filename)) {// 普通上传文件 $this->error = ‘文件上传保存错误!‘; return false; } // 返回 File对象实例 $file = new self($filename);// 经过一系列的报错 处理之后 $file->setSaveName($saveName);// 设置 报错文件 $file->setUploadInfo($this->info);// 保存 信息 到 信息中 return $file;// 返回 实例化 句柄 } /** * 获取保存文件名 * @param string|bool $savename 保存的文件名 默认自动生成 * @return string */ protected function buildSaveName($savename) { if (true === $savename) { // 自动生成文件名 if ($this->rule instanceof \Closure) { $savename = call_user_func_array($this->rule, [$this]);// 获取 文件名 } else { switch ($this->rule) { case ‘md5‘: $md5 = md5_file($this->filename); $savename = substr($md5, 0, 2) . DS . substr($md5, 2);// md5 方式的文件名 break; case ‘sha1‘: $sha1 = sha1_file($this->filename); $savename = substr($sha1, 0, 2) . DS . substr($sha1, 2);// sha1 方式文件名 break; case ‘date‘: $savename = date(‘Ymd‘) . DS . md5(microtime(true));// 日期方式 文件名 break; default: $savename = call_user_func($this->rule);// 调用规则函数 生成文件名 } } } elseif (‘‘ === $savename) { $savename = $this->getInfo(‘name‘);// 空 } if (!strpos($savename, ‘.‘)) { $savename .= ‘.‘ . pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION);// 有自己指定的文件名 } return $savename; } /** * 获取错误代码信息 * @param int $errorNo 错误号 */ private function error($errorNo)// 错误信息翻译 { switch ($errorNo) { case 1: case 2: $this->error = ‘上传文件大小超过了最大值!‘; break; case 3: $this->error = ‘文件只有部分被上传!‘; break; case 4: $this->error = ‘没有文件被上传!‘; break; case 6: $this->error = ‘找不到临时文件夹!‘; break; case 7: $this->error = ‘文件写入失败!‘; break; default: $this->error = ‘未知上传错误!‘; } } /** * 获取错误信息 * @return mixed */ public function getError()// 返回错误信息 { return $this->error; } }
本文出自 “专注php 群号:414194301” 博客,请务必保留此出处http://jingshanls.blog.51cto.com/3357095/1877990
[李景山php]每天TP5-20170105|thinkphp5-File.php-2
标签:thinkphp5
原文地址:http://jingshanls.blog.51cto.com/3357095/1877990