secretId = $config['AccessKeyId']; $this->secretKey = $config['AccessKeySecret']; $this->bucket = $config['Bucket']; $this->region = $config['Region']; $this->domain = $config['Domain']; } /** * 上传文件到腾讯云 COS */ public function picture() { // 获取表单上传文件 $files = request()->file('file', ''); if (empty($files)) { return $this->renderError("请上传图片"); } // 文件格式校验 $ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif', 'apk', 'mp3']; $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1); if (!in_array($type, $ext)) { return $this->renderError("文件格式错误"); } // 文件大小校验 if ($_FILES['file']['size'] > 20971520) { return $this->renderError("上传文件不能超过20M"); } // 判断是否上传过 $hash = $files->hash('sha1'); $info = Db::name('picture')->where('token', $hash)->find(); if (false) { $data['path'] = imageUrl($info['imgurl']); $data['imgurl'] = $info['imgurl']; return $this->renderSuccess('上传成功', $data); } else { // 初始化腾讯云 COS 客户端 $cosClient = new Client([ 'region' => $this->region, 'schema' => 'https', // 协议 'credentials' => [ 'secretId' => $this->secretId, 'secretKey' => $this->secretKey, ], ]); // 生成唯一文件名 $date = date('Ymd'); $uniqueFileName = md5(uniqid(rand(), true)) . '.' . $type; $cosKey = 'topic/' . $date . '/' . $uniqueFileName; // COS 中的文件路径 try { // 上传文件到腾讯云 COS $result = $cosClient->putObject([ 'Bucket' => $this->bucket, 'Key' => $cosKey, 'Body' => fopen($_FILES['file']['tmp_name'], 'rb'), // 文件内容 ]); // 获取文件访问 URL $cosUrl = $result['Location']; $imgurl = $this->domain . $cosKey; // 新增数据到数据库 $save_data['token'] = $hash; $save_data['imgurl'] = $imgurl; // 保存 COS 中的文件路径 $save_data['addtime'] = time(); $save_data['type'] = 1; $res = Db::name('picture')->insertGetId($save_data); if ($res) { $data['id'] = $res; $data['path'] = $imgurl; // 返回文件的完整访问 URL $data['imgurl'] = $imgurl ; return $this->renderSuccess('上传成功', $data); } else { return $this->renderError('上传失败'); } } catch (\Exception $e) { return $this->renderError('文件上传失败:' . $e->getMessage()); } } } /** * 上传文件 */ public function picture_file() { // 获取表单上传文件 $files = request()->file('file', ''); if (empty($files)) { return $this->renderError("请上传图片"); } $ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif', 'apk', 'mp3']; $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1); if (!in_array($type, $ext)) { return $this->renderError("文件格式错误"); } if ($_FILES['file']['size'] > 20971520) { return $this->renderError("上传文件不能超过20M"); } // 判断是否上传过 $hash = $files->hash('sha1'); $info = Db::name('picture')->where('token', $hash)->find(); if ($info) { // if (false) { $data['path'] = imageUrl($info['imgurl']); $data['imgurl'] = $info['imgurl']; return $this->renderSuccess('上传成功', $data); } else { // 保存图片 $date = date('Ymd'); $uniqueFileName = md5(uniqid(rand(), true)) . '.' . $type; $saveDir = './storage/topic/' . $date; if (!is_dir($saveDir)) { mkdir($saveDir, 0777, true); } $savename = $saveDir . '/' . $uniqueFileName; // 移动文件到目标目录 if (move_uploaded_file($_FILES['file']['tmp_name'], $savename)) { $savename = str_replace('\\', '/', $savename); $savename = substr($savename, 1); // 去掉开头的 “.” // 新增数据 $save_data['token'] = $hash; $save_data['imgurl'] = $savename; $save_data['addtime'] = time(); $res = Db::name('picture')->insertGetId($save_data); if ($res) { $data['id'] = $res; $data['path'] = imageUrl($savename); $data['imgurl'] = $savename; return $this->renderSuccess('上传成功', $data); } else { return $this->renderError('上传失败'); } } else { return $this->renderError('文件保存失败'); } } } /** * 阿里云oss上传 */ public function picture_other() { #获取表单上传文件 $files = request()->file('file', ''); if (empty($files)) { return $this->renderError("请上传文件"); } $ext = ['apk']; $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1); if (!in_array($type, $ext)) { return $this->renderError("文件格式错误"); } if ($_FILES['file']['size'] > 104857600) { return $this->renderError("上传文件不能超过100M"); } $oss = Config::getConfigInfo('aliyun_oss'); $object_file = 'newimage'; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 $accessKeyId = $oss['file_accessKeyId']; $accessKeySecret = $oss['file_accessKeySecret']; // Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint = $oss['file_endpoint']; // 设置存储空间名称。 $bucket = $oss['file_bucket']; // 设置文件名称。 $object = $object_file . '/' . date('Ym') . '/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $type; // 由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。 $filePath = $_FILES['file']['tmp_name']; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); $ossClient->uploadFile($bucket, $object, $filePath); } catch (OssException $e) { return $this->renderError("上传失败"); } $data['path'] = imageUrl($object); $data['imgurl'] = $object; return $this->renderSuccess('上传成功', $data); } /** * 上传图片 */ public function picture_old() { #获取表单上传文件 $files = request()->file('file', ''); if (empty($files)) { return $this->renderError("请上传图片"); } $ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif']; $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1); if (!in_array($type, $ext)) { return $this->renderError("文件格式错误"); } if ($_FILES['file']['size'] > 5242880) { return $this->renderError("上传文件不能超过5M"); } #判断是否上传过 $hash = $files->hash('sha1'); $info = Picture::where('token', $hash)->find(); if ($info) { $data['id'] = $info['id']; $data['path'] = imageUrl($info['imgurl']); $data['imgurl'] = $info['imgurl']; return $this->renderSuccess('上传成功', $data); } else { #保存图片 $savename = \think\facade\Filesystem::disk('public')->putFile('topic', $files); $hash = $files->hash('sha1'); $savename = '/storage/' . $savename; $savename = str_replace('\\', '/', $savename); #新增数据 $save_data['token'] = $hash; $save_data['imgurl'] = $savename; $save_data['addtime'] = time(); $res = (new Picture())->save($save_data); if ($res) { $data['id'] = $res; $data['path'] = imageUrl($savename); $data['imgurl'] = $savename; return $this->renderSuccess('上传成功', $data); } else { return $this->renderError('上传失败'); } } } /** * 上传证书 */ public function wechat_cert() { $files = request()->file('file', ''); $ext = ['cer', 'pfx']; $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1); if (!in_array($type, $ext)) { return $this->renderError("文件格式错误"); } $savename = $_FILES['file']['name']; \think\facade\Filesystem::disk('ssl')->putFileAs('', $files, $savename); return $this->renderSuccess('上传成功', $savename); } }