<?php namespace addons\qiniu\controller; use addons\qiniu\library\Auth; use app\common\model\Attachment; use think\addons\Controller; use think\Config; /** * 七牛管理 * */ class Index extends Controller { public function index() { $this->error("当前插件暂无前台页面"); } /** * 上传接口 */ public function upload() { Config::set('default_return_type', 'json'); if (!session('admin') && !$this->auth->id) { $this->error("请登录后再进行操作"); } $config = get_addon_config('qiniu'); $file = $this->request->file('file'); if (!$file || !$file->isValid()) { $this->error("请上传有效的文件"); } $fileInfo = $file->getInfo(); $filePath = $file->getRealPath() ?: $file->getPathname(); preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches); $type = strtolower($matches[2]); $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3]; $size = (int)$config['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0); $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); $suffix = $suffix ? $suffix : 'file'; $md5 = md5_file($filePath); $search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)']; $replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix]; $object = ltrim(str_replace($search, $replace, $config['savekey']), '/'); $mimetypeArr = explode(',', strtolower($config['mimetype'])); $typeArr = explode('/', $fileInfo['type']); //检查文件大小 if (!$file->checkSize($size)) { $this->error("起过最大可上传文件限制"); } //验证文件后缀 if ($config['mimetype'] !== '*' && ( !in_array($suffix, $mimetypeArr) || (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))) ) ) { $this->error(__('上传格式限制')); } $savekey = '/' . $object; $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1); $fileName = substr($savekey, strripos($savekey, '/') + 1); //先上传到本地 $splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName); if ($splInfo) { $extparam = $this->request->post(); $filePath = $splInfo->getRealPath() ?: $splInfo->getPathname(); $sha1 = sha1_file($filePath); $imagewidth = $imageheight = 0; if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) { $imgInfo = getimagesize($splInfo->getPathname()); $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth; $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight; } $params = array( 'admin_id' => session('admin.id'), 'user_id' => $this->auth->id, 'filesize' => $fileInfo['size'], 'imagewidth' => $imagewidth, 'imageheight' => $imageheight, 'imagetype' => $suffix, 'imageframes' => 0, 'mimetype' => $fileInfo['type'], 'url' => $uploadDir . $splInfo->getSaveName(), 'uploadtime' => time(), 'storage' => 'local', 'sha1' => $sha1, 'extparam' => json_encode($extparam), ); $attachment = Attachment::create(array_filter($params), true); $policy = array( 'saveKey' => ltrim($savekey, '/'), ); $auth = new Auth($config['app_key'], $config['secret_key']); $token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy); $multipart = [ ['name' => 'token', 'contents' => $token], [ 'name' => 'file', 'contents' => fopen($filePath, 'r'), 'filename' => $fileName, ] ]; try { $client = new \GuzzleHttp\Client(); $res = $client->request('POST', $config['uploadurl'], [ 'multipart' => $multipart ]); $code = $res->getStatusCode(); //成功不做任何操作 } catch (\GuzzleHttp\Exception\ClientException $e) { $attachment->delete(); unlink($filePath); $this->error("上传失败"); } $url = '/' . $object; //上传成功后将存储变更为qiniu $attachment->storage = 'qiniu'; $attachment->save(); $this->success("上传成功", null, ['url' => $url]); } else { $this->error('上传失败'); } return; } /** * 通知回调 */ public function notify() { $config = get_addon_config('qiniu'); $auth = new Auth($config['app_key'], $config['secret_key']); $contentType = 'application/x-www-form-urlencoded'; $authorization = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : ''; if (!$authorization && function_exists('apache_request_headers')) { $headers = apache_request_headers(); $authorization = isset($headers['Authorization']) ? $headers['Authorization'] : ''; } $url = $config['notifyurl']; $body = file_get_contents('php://input'); $ret = $auth->verifyCallback($contentType, $authorization, $url, $body); if ($ret) { parse_str($body, $arr); $admin_id = isset($arr['admin']) ? $arr['admin'] : 0; $user_id = isset($arr['user']) ? $arr['user'] : 0; $imageInfo = json_decode($arr['imageInfo'], true); $params = array( 'admin_id' => (int)$admin_id, 'user_id' => (int)$user_id, 'filesize' => $arr['filesize'], 'imagewidth' => isset($imageInfo['width']) ? $imageInfo['width'] : 0, 'imageheight' => isset($imageInfo['height']) ? $imageInfo['height'] : 0, 'imagetype' => isset($imageInfo['format']) ? $imageInfo['format'] : '', 'imageframes' => 1, 'mimetype' => "image/" . (isset($imageInfo['format']) ? $imageInfo['format'] : ''), 'extparam' => '', 'url' => '/' . $arr['key'], 'uploadtime' => time(), 'storage' => 'qiniu' ); Attachment::create($params); return json(['ret' => 'success', 'code' => 1, 'data' => ['url' => $params['url']]]); } return json(['ret' => 'failed']); } }