Server : nginx/1.20.1 System : Linux iZ2ze9ojcl78uluczwag69Z 4.18.0-240.22.1.el8_3.x86_64 #1 SMP Thu Apr 8 19:01:30 UTC 2021 x86_64 User : www ( 1000) PHP Version : 7.3.28 Disable Function : passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv Directory : /www/wwwroot/0531yanglao.com/vendor/topthink/framework/src/think/ |
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- declare (strict_types = 1); namespace think; use SplFileInfo; use think\exception\FileException; /** * 文件上传类 * @package think */ class File extends SplFileInfo { /** * 文件hash规则 * @var array */ protected $hash = []; protected $hashName; public function __construct(string $path, bool $checkPath = true) { if ($checkPath && !is_file($path)) { throw new FileException(sprintf('The file "%s" does not exist', $path)); } parent::__construct($path); } /** * 获取文件的哈希散列值 * @access public * @param string $type * @return string */ public function hash(string $type = 'sha1'): string { if (!isset($this->hash[$type])) { $this->hash[$type] = hash_file($type, $this->getPathname()); } return $this->hash[$type]; } /** * 获取文件的MD5值 * @access public * @return string */ public function md5(): string { return $this->hash('md5'); } /** * 获取文件的SHA1值 * @access public * @return string */ public function sha1(): string { return $this->hash('sha1'); } /** * 获取文件类型信息 * @access public * @return string */ public function getMime(): string { $finfo = finfo_open(FILEINFO_MIME_TYPE); return finfo_file($finfo, $this->getPathname()); } /** * 移动文件 * @access public * @param string $directory 保存路径 * @param string|null $name 保存的文件名 * @return File */ public function move(string $directory, string $name = null): File { $target = $this->getTargetFile($directory, $name); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); $renamed = rename($this->getPathname(), (string) $target); restore_error_handler(); if (!$renamed) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error))); } @chmod((string) $target, 0666 & ~umask()); return $target; } /** * 实例化一个新文件 * @param string $directory * @param null|string $name * @return File */ protected function getTargetFile(string $directory, string $name = null): File { if (!is_dir($directory)) { if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) { throw new FileException(sprintf('Unable to create the "%s" directory', $directory)); } } elseif (!is_writable($directory)) { throw new FileException(sprintf('Unable to write in the "%s" directory', $directory)); } $target = rtrim($directory, '/\\') . \DIRECTORY_SEPARATOR . (null === $name ? $this->getBasename() : $this->getName($name)); return new self($target, false); } /** * 获取文件名 * @param string $name * @return string */ protected function getName(string $name): string { $originalName = str_replace('\\', '/', $name); $pos = strrpos($originalName, '/'); $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1); return $originalName; } /** * 文件扩展名 * @return string */ public function extension(): string { return $this->getExtension(); } /** * 自动生成文件名 * @access public * @param string|\Closure $rule * @return string */ public function hashName($rule = ''): string { if (!$this->hashName) { if ($rule instanceof \Closure) { $this->hashName = call_user_func_array($rule, [$this]); } else { switch (true) { case in_array($rule, hash_algos()): $hash = $this->hash($rule); $this->hashName = substr($hash, 0, 2) . DIRECTORY_SEPARATOR . substr($hash, 2); break; case is_callable($rule): $this->hashName = call_user_func($rule); break; default: $this->hashName = date('Ymd') . DIRECTORY_SEPARATOR . md5(microtime(true) . $this->getPathname()); break; } } } return $this->hashName . '.' . $this->extension(); } }