config('filesystems.disks.cos.region'), 'credentials' => [ 'secretId' => config('filesystems.disks.cos.secret_id'), 'secretKey' => config('filesystems.disks.cos.secret_key') ] ]); try { $notUploadedSize = $file->getSize(); $options = [ 'PartSize' => 1 * 1024 * 1024, 'Progress' => function ($totalSize, $uploadedSize) use (&$notUploadedSize, $progressBar) { $partSize = $uploadedSize - ($totalSize - $notUploadedSize); $notUploadedSize = $totalSize - $uploadedSize; $progressBar?->increment($partSize); }, 'ACL' => 'private', ]; $cosClient->upload( sprintf("%s-%s", config('filesystems.disks.cos.bucket'), config('filesystems.disks.cos.app_id')), $pathname, fopen($file->getRealPath(), 'rb'), $options, ); if ($notUploadedSize > 0) { $progressBar?->increment($notUploadedSize); } } catch (\Exception $exception) { Log::error('File upload failed messge:' . $exception->getMessage()); throw new UploadFailedException("File upload failed."); } return $pathname; } /** * 获取临时密钥 * @return array */ public function getTempKeys(string $pathPrefix = ''): array { $sts = new Sts(); $cosConfig = config('filesystems.disks.cos'); $bucket = $cosConfig['bucket'] . '-' . $cosConfig['app_id']; $config = [ 'url' => 'https://sts.tencentcloudapi.com/', 'secretId' => $cosConfig['secret_id'], 'secretKey' => $cosConfig['secret_key'], 'bucket' => $bucket, 'region' => $cosConfig['region'], 'durationSeconds' => 7200, // 密钥有效期(秒) 'allowPrefix' => [$pathPrefix . '/*'], // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用) // 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923 'allowActions' => [ // 简单上传 'name/cos:PutObject', 'name/cos:PostObject', // 分片上传 'name/cos:InitiateMultipartUpload', 'name/cos:ListMultipartUploads', 'name/cos:ListParts', 'name/cos:UploadPart', 'name/cos:CompleteMultipartUpload' ], // 临时密钥生效条件,关于condition的详细设置规则和COS支持的condition类型可以参考 https://cloud.tencent.com/document/product/436/71306 "condition" => [] ]; $data = $sts->getTempKeys($config); $data['bucket'] = $bucket; $data['region'] = $cosConfig['region']; $data['pathPrefix'] = $pathPrefix; return $data; } }