| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | namespace think; |
| |
|
| | use SplFileObject; |
| |
|
| | class File extends SplFileObject |
| | { |
| | |
| | |
| | |
| | private $error = ''; |
| |
|
| | |
| | |
| | |
| | protected $filename; |
| |
|
| | |
| | |
| | |
| | protected $saveName; |
| |
|
| | |
| | |
| | |
| | protected $rule = 'date'; |
| |
|
| | |
| | |
| | |
| | protected $validate = []; |
| |
|
| | |
| | |
| | |
| | protected $isTest; |
| |
|
| | |
| | |
| | |
| | protected $info; |
| |
|
| | |
| | |
| | |
| | protected $hash = []; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function __construct($filename, $mode = 'r') |
| | { |
| | parent::__construct($filename, $mode); |
| | $this->filename = $this->getRealPath() ?: $this->getPathname(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function isTest($test = false) |
| | { |
| | $this->isTest = $test; |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setUploadInfo($info) |
| | { |
| | $this->info = $info; |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getInfo($name = '') |
| | { |
| | return isset($this->info[$name]) ? $this->info[$name] : $this->info; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getSaveName() |
| | { |
| | return $this->saveName; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setSaveName($saveName) |
| | { |
| | $this->saveName = $saveName; |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function hash($type = 'sha1') |
| | { |
| | if (!isset($this->hash[$type])) { |
| | $this->hash[$type] = hash_file($type, $this->filename); |
| | } |
| |
|
| | return $this->hash[$type]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function checkPath($path) |
| | { |
| | if (is_dir($path) || mkdir($path, 0755, true)) { |
| | return true; |
| | } |
| |
|
| | $this->error = ['directory {:path} creation failed', ['path' => $path]]; |
| |
|
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getMime() |
| | { |
| | $finfo = finfo_open(FILEINFO_MIME_TYPE); |
| |
|
| | return finfo_file($finfo, $this->filename); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function rule($rule) |
| | { |
| | $this->rule = $rule; |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function validate(array $rule = []) |
| | { |
| | $this->validate = $rule; |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function isValid() |
| | { |
| | return $this->isTest ? is_file($this->filename) : is_uploaded_file($this->filename); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function check($rule = []) |
| | { |
| | $rule = $rule ?: $this->validate; |
| |
|
| | |
| | if (isset($rule['size']) && !$this->checkSize($rule['size'])) { |
| | $this->error = 'filesize not match'; |
| | return false; |
| | } |
| |
|
| | |
| | if (isset($rule['type']) && !$this->checkMime($rule['type'])) { |
| | $this->error = 'mimetype to upload is not allowed'; |
| | return false; |
| | } |
| |
|
| | |
| | if (isset($rule['ext']) && !$this->checkExt($rule['ext'])) { |
| | $this->error = 'extensions to upload is not allowed'; |
| | return false; |
| | } |
| |
|
| | |
| | if (!$this->checkImg()) { |
| | $this->error = 'illegal image files'; |
| | return false; |
| | } |
| |
|
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function checkExt($ext) |
| | { |
| | if (is_string($ext)) { |
| | $ext = explode(',', $ext); |
| | } |
| |
|
| | $extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION)); |
| |
|
| | return in_array($extension, $ext); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function checkImg() |
| | { |
| | $extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION)); |
| |
|
| | |
| | return !in_array($extension, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']) || in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6, 13]); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function getImageType($image) |
| | { |
| | if (function_exists('exif_imagetype')) { |
| | return exif_imagetype($image); |
| | } |
| |
|
| | try { |
| | $info = getimagesize($image); |
| | return $info ? $info[2] : false; |
| | } catch (\Exception $e) { |
| | return false; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function checkSize($size) |
| | { |
| | return $this->getSize() <= $size; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function checkMime($mime) |
| | { |
| | $mime = is_string($mime) ? explode(',', $mime) : $mime; |
| |
|
| | return in_array(strtolower($this->getMime()), $mime); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | 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 = 'upload illegal files'; |
| | 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 = ['has the same filename: {:filename}', ['filename' => $filename]]; |
| | return false; |
| | } |
| |
|
| | |
| | if ($this->isTest) { |
| | rename($this->filename, $filename); |
| | } elseif (!move_uploaded_file($this->filename, $filename)) { |
| | $this->error = 'upload write error'; |
| | return false; |
| | } |
| |
|
| | |
| | $file = new self($filename); |
| | $file->setSaveName($saveName)->setUploadInfo($this->info); |
| |
|
| | return $file; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | 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 'date': |
| | $savename = date('Ymd') . DS . md5(microtime(true)); |
| | break; |
| | default: |
| | if (in_array($this->rule, hash_algos())) { |
| | $hash = $this->hash($this->rule); |
| | $savename = substr($hash, 0, 2) . DS . substr($hash, 2); |
| | } elseif (is_callable($this->rule)) { |
| | $savename = call_user_func($this->rule); |
| | } else { |
| | $savename = date('Ymd') . DS . md5(microtime(true)); |
| | } |
| | } |
| | } |
| | } elseif ('' === $savename || false === $savename) { |
| | $savename = $this->getInfo('name'); |
| | } |
| |
|
| | if (!strpos($savename, '.')) { |
| | $savename .= '.' . pathinfo($this->getInfo('name'), PATHINFO_EXTENSION); |
| | } |
| |
|
| | return $savename; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private function error($errorNo) |
| | { |
| | switch ($errorNo) { |
| | case 1: |
| | case 2: |
| | $this->error = 'upload File size exceeds the maximum value'; |
| | break; |
| | case 3: |
| | $this->error = 'only the portion of file is uploaded'; |
| | break; |
| | case 4: |
| | $this->error = 'no file to uploaded'; |
| | break; |
| | case 6: |
| | $this->error = 'upload temp dir not found'; |
| | break; |
| | case 7: |
| | $this->error = 'file write error'; |
| | break; |
| | default: |
| | $this->error = 'unknown upload error'; |
| | } |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getError() |
| | { |
| | if (is_array($this->error)) { |
| | list($msg, $vars) = $this->error; |
| | } else { |
| | $msg = $this->error; |
| | $vars = []; |
| | } |
| |
|
| | return Lang::has($msg) ? Lang::get($msg, $vars) : $msg; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function __call($method, $args) |
| | { |
| | return $this->hash($method); |
| | } |
| | } |
| |
|