// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\store\controller; use app\store\model\Setting as SettingModel; use app\store\model\UploadFile as UploadFileModel; use app\common\enum\Setting as SettingEnum; use app\common\enum\file\FileType as FileTypeEnum; use app\common\library\storage\Driver as StorageDriver; use think\facade\Log; use think\response\Json; use Google\Cloud\Storage\StorageClient; use Google\Auth\Credentials\ServiceAccountCredentials; /** * 文件库管理 * Class Upload * @package app\store\controller */ class Upload extends Controller { // 当前商城的上传设置 private $config; /** * 构造方法 * @throws \app\common\exception\BaseException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function initialize() { parent::initialize(); // 存储配置信息 $this->config = SettingModel::getItem(SettingEnum::STORAGE); } /** * 图片上传接口 * @param int $groupId 分组ID * @return Json * @throws \think\Exception */ public function image(int $groupId = 0): Json { // 实例化存储驱动 $storage = new StorageDriver($this->config); // 设置上传文件的信息 $storage->setUploadFile('iFile') ->setRootDirName((string)$this->storeId) ->setValidationScene('image'); // 执行文件上传 if (!$storage->upload()) { return $this->renderError('图片上传失败:' . $storage->getError()); } // 文件信息 $fileInfo = $storage->getSaveFileInfo(); // 添加文件库记录 $model = new UploadFileModel; $model->add($fileInfo, FileTypeEnum::IMAGE, $groupId); //$filePath = $fileInfo['file_path']; //todo 上传到谷歌GCS $keyFilePath = '/etc/nginx/nginx/html/dihua-01-5690813badec.json'; $storage = new StorageClient(['projectId' => 'dihua-01', 'keyFilePath' => $keyFilePath]); $bucket = $storage->bucket('freeshippingvps'); $filePath = public_path($fileInfo['file_path']); $storageObj = $bucket->upload( fopen($filePath, 'r'), [ 'name' => $fileInfo['file_path'] ] ); $name = $storageObj->name(); if (empty($name)){ Log::error('上传文件到google云失败'); } // 图片上传成功 return $this->renderSuccess(['fileInfo' => $model->toArray()], '图片上传成功'); } /** * 视频上传接口 * @param int $groupId 分组ID * @return Json * @throws \think\Exception */ public function video(int $groupId = 0): Json { // 实例化存储驱动 $storage = new StorageDriver($this->config); // 设置上传文件的信息 $storage->setUploadFile('iFile') ->setRootDirName((string)$this->storeId) ->setValidationScene('video'); // 执行文件上传 if (!$storage->upload()) { return $this->renderError('视频上传失败:' . $storage->getError()); } // 文件信息 $fileInfo = $storage->getSaveFileInfo(); // 添加文件库记录 $model = new UploadFileModel; $model->add($fileInfo, FileTypeEnum::VIDEO, $groupId); // 图片上传成功 return $this->renderSuccess(['fileInfo' => $model->toArray()], '视频上传成功'); } }