diff --git a/composer.json b/composer.json index 9eeef5ba..f1bc0ce0 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,8 @@ "topthink/think-cors": "^1.0", "phpoffice/phpspreadsheet": "^3.8", "friendsofsymfony/oauth2-php": "^1.3", - "mobiledetect/mobiledetectlib": "4.8.09" + "mobiledetect/mobiledetectlib": "4.8.09", + "qiniu/php-sdk": "^7.14" }, "require-dev": { "symfony/var-dumper": ">=4.2", diff --git a/extend/uploader/Qiniu.php b/extend/uploader/Qiniu.php new file mode 100644 index 00000000..54551cb3 --- /dev/null +++ b/extend/uploader/Qiniu.php @@ -0,0 +1,157 @@ + 1024 * 1024 * 5, // 默认最大上传5M + 'fileExt' => 'jpeg,jpg,png', // 默认上传文件后缀 + 'fileMime' => 'image/jpeg,image/png,image/gif' // 默认上传文件mime + ]; + + private $dir = true; + private $originalName = false; + private $pathPrefix = ''; + private $fileNamePrefix = 'orico'; + + static public $domain = 'http://opdfile.f2b211.com/'; + + public function __construct($conf = []) + { + if (!empty($conf['bucket'])) { + $this->bucket = $conf['bucket']; + } + if (!empty($conf['accessKey'])) { + $this->accessKey = $conf['accessKey']; + } + if (!empty($conf['secretKey'])) { + $this->secretKey = $conf['secretKey']; + } + if (!empty($conf['pathPrefix'])) { + $this->pathPrefix = trim($conf['pathPrefix'], '/'); + } + } + + /** + * 生成随机字符串 + */ + private function random($length, $type = "string", $convert = "0") + { + $conf = [ + 'number' => '0123456789', + 'string' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'all' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=' + ]; + $string = $conf[$type]; + if (!$string) { + $string = $conf['string']; + } + $strlen = strlen($string) - 1; + $char = ''; + for ($i = 0; $i < $length; $i++) { + $char .= $string[mt_rand(0, $strlen)]; + } + if ($convert > 0) { + $res = strtoupper($char); + } elseif ($convert == 0) { + $res = $char; + } elseif ($convert < 0) { + $res = strtolower($char); + } + return $res; + } + + /** + * 组装文件名 + */ + private function buildFileName() + { + return $this->fileNamePrefix . time() . substr(time(), -5) . substr(microtime(), 2, 3) . $this->random(8); + } + + /** + * 上传验证规则 + */ + public function validate($rule) + { + $this->rule = $rule; + } + + /** + * 上传文件到七牛云 + */ + public function uploadFile($name) + { + // 构建鉴权对象 + $auth = new Auth($this->accessKey, $this->secretKey); + + // 生成上传 Token + $token = $auth->uploadToken($this->bucket); + + // 初始化 UploadManager 对象并进行文件的上传。 + $uploadMgr = new UploadManager(); + + $file = request()->file($name); + + $aspectRatio = []; + if (!empty($this->rule['aspectRatio'])) { + $aspectRatio = $this->rule['aspectRatio']; + unset($this->rule['aspectRatio']); + } + $validate = validate([$name => $this->rule]); + if (!$validate->check([$name => $file])) { + throw new \Exception($validate->getError()); + } + + $fileName = $file->getOriginalName(); // 文件原名 + if (!$this->originalName) { + $fileName = $this->buildFileName() . '.' . $file->extension(); + if (!$this->dir && !empty($this->pathPrefix)) { + $fileName = $this->pathPrefix . '/' . $fileName; + } + } + if ($this->dir) { + $fileName = date('Y') . '/' . date('m') . '/' . date('d') . '/' . $fileName; + if (!empty($this->pathPrefix)) { + $fileName = $this->pathPrefix . '/' . $fileName; + } + } + $filePath = $file->getPathname(); // 临时路径 + if (!empty($aspectRatio)) { // 验证图片宽高 + list($width, $height, $type, $attr) = getimagesize($file); + if ($width != $aspectRatio['width'] || $height != $aspectRatio['height']) { + throw new \Exception('图片宽高不符合'); + } + } + $fileType = $file->getOriginalMime(); + list($ret, $err) = $uploadMgr->putFile($token, $fileName, $filePath, null, $fileType, false); + + if ($err !== null) { + throw new \Exception($err); + } else { + return ['hash' => $ret['hash'], 'filename' => $ret['key'], 'remote_url' => self::$domain . $ret['key']]; + } + } + + + /** + * 上传文件到七牛云 + */ + public function deleteFile($name) + { + // 构建鉴权对象 + $auth = new Auth($this->accessKey, $this->secretKey); + // 初始化 BucketManager 对象并进行文件的删除。 + $bucketManager = new BucketManager($auth); + $ret = $bucketManager->delete($this->bucket, $name); + return $ret; + } +}