From 5ccf124c35860d824bec7011088fef3cd8397bb6 Mon Sep 17 00:00:00 2001 From: Gosowong <1329847115@qq.com> Date: Mon, 5 Jun 2023 15:24:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E4=BA=91=E5=88=9B=E5=BB=BA=E6=A1=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/upload/extend/jdoss/Client.php | 47 ++++++++++++++++++- crmeb/crmeb/services/upload/storage/Jdoss.php | 36 +++++++++++++- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/crmeb/crmeb/services/upload/extend/jdoss/Client.php b/crmeb/crmeb/services/upload/extend/jdoss/Client.php index 12b7f1746..cf1cdd336 100644 --- a/crmeb/crmeb/services/upload/extend/jdoss/Client.php +++ b/crmeb/crmeb/services/upload/extend/jdoss/Client.php @@ -14,6 +14,7 @@ namespace crmeb\services\upload\extend\jdoss; +use crmeb\exceptions\UploadException; use crmeb\services\upload\BaseClient; /** @@ -30,7 +31,7 @@ class Client extends BaseClient * AK * @var */ - protected $accessKeyId = 'FHZVOVXFEMUGWOVARS8H'; + protected $accessKeyId; /** * SK @@ -76,6 +77,27 @@ class Client extends BaseClient $this->uploadUrl = $config['uploadUrl'] ?? ''; } + /** + * 检测桶,不存在返回true + * @param string $bucket + * @param string $region + * @return array|bool|\crmeb\services\upload\extend\cos\SimpleXMLElement + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/10/17 + */ + public function headBucket(string $bucket, string $region = '') + { + $url = $this->getRequestUrl($bucket, $region); + + $header = [ + 'Host' => $url + ]; + + return $this->request('https://' . $url, 'head', [], $header); + } + + /** * 获取桶列表 * @return array|\crmeb\services\upload\extend\cos\SimpleXMLElement @@ -96,6 +118,22 @@ class Client extends BaseClient return $res; } + public function createBucket($name, $region, $acl) + { + $url = $this->getRequestUrl($name, $region); + $header = [ + 'Host' => $url, + 'Date' => gmdate('D, d M Y H:i:s \G\M\T'), + 'name' => $name, + 'x-amz-acl' => $acl + ]; + + + $res = $this->request('https://' . $url . '/', 'PUT', [], $header); + + return $res; + } + /** * 获取请求域名 * @param string $bucket @@ -107,6 +145,13 @@ class Client extends BaseClient */ protected function getRequestUrl(string $bucket = '', string $region = self::DEFAULT_REGION) { + if (!$this->accessKeyId) { + throw new UploadException('请传入SecretId'); + } + if (!$this->secretKey) { + throw new UploadException('请传入SecretKey'); + } + return ($bucket ? $bucket . '.' : '') . 's3.' . $region . '.jdcloud-oss.com'; } diff --git a/crmeb/crmeb/services/upload/storage/Jdoss.php b/crmeb/crmeb/services/upload/storage/Jdoss.php index 106085445..ce7018bfa 100644 --- a/crmeb/crmeb/services/upload/storage/Jdoss.php +++ b/crmeb/crmeb/services/upload/storage/Jdoss.php @@ -5,6 +5,11 @@ namespace crmeb\services\upload\storage; use crmeb\services\upload\BaseUpload; use crmeb\services\upload\extend\jdoss\Client as CrmebClient; +/** + * 京东云COS文件上传 + * Class Jdoss + * @package crmeb\services\upload\storage + */ class Jdoss extends BaseUpload { @@ -131,9 +136,36 @@ class Jdoss extends BaseUpload } } - public function createBucket(string $name, string $region) + public function createBucket(string $name, string $region = '', string $acl = 'public-read') { - // TODO: Implement createBucket() method. + $regionData = $this->getRegion(); + $regionData = array_column($regionData, 'value'); + if (!in_array($region, $regionData)) { + return $this->setError('COS:无效的区域!'); + } + $this->storageRegion = $region; + $app = $this->app(); + //检测桶 + try { + $app->headBucket($name); + } catch (\Throwable $e) { + //桶不存在返回404 + if (strstr('404', $e->getMessage())) { + return $this->setError('COS:' . $e->getMessage()); + } + } + //创建桶 + try { + $res = $app->createBucket($name, $region, $acl); + } catch (\Throwable $e) { + if (strstr('[curl] 6', $e->getMessage())) { + return $this->setError('COS:无效的区域!!'); + } else if (strstr('Access Denied.', $e->getMessage())) { + return $this->setError('COS:无权访问'); + } + return $this->setError('COS:' . $e->getMessage()); + } + return $res; } public function getRegion() From ee194ab467711a482a3fd480d2f7976b8de91d99 Mon Sep 17 00:00:00 2001 From: Gosowong <1329847115@qq.com> Date: Mon, 5 Jun 2023 16:21:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E4=BA=91=E9=A9=B1=E5=8A=A8=20=E4=BD=BF=E7=94=A8aws=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crmeb/crmeb/services/upload/storage/Jdoss.php | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/crmeb/crmeb/services/upload/storage/Jdoss.php b/crmeb/crmeb/services/upload/storage/Jdoss.php index ce7018bfa..dddf086a3 100644 --- a/crmeb/crmeb/services/upload/storage/Jdoss.php +++ b/crmeb/crmeb/services/upload/storage/Jdoss.php @@ -2,8 +2,9 @@ namespace crmeb\services\upload\storage; +use Aws\S3\S3Client; +use crmeb\exceptions\UploadException; use crmeb\services\upload\BaseUpload; -use crmeb\services\upload\extend\jdoss\Client as CrmebClient; /** * 京东云COS文件上传 @@ -34,7 +35,7 @@ class Jdoss extends BaseUpload /** * 句柄 - * @var CrmebClient + * @var S3Client */ protected $handle; @@ -95,17 +96,25 @@ class Jdoss extends BaseUpload } /** - * 实例化cos - * @return CrmebClient + * @return S3Client + * + * @date 2023/06/05 + * @author yyw */ protected function app() { - $this->handle = new CrmebClient([ - 'accessKey' => $this->accessKey, - 'secretKey' => $this->secretKey, + if (!$this->accessKey || !$this->secretKey) { + throw new UploadException(400721); + } + $this->handle = new S3Client([ + 'version' => 'latest', 'region' => $this->storageRegion, - 'bucket' => $this->storageName, - 'uploadUrl' => $this->uploadUrl + 'endpoint' => "http://s3.{$this->storageRegion}.jdcloud-oss.com", + 'signature_version' => 'v4', + 'credentials' => [ + 'key' => $this->accessKey, + 'secret' => $this->secretKey, + ], ]); return $this->handle; } @@ -147,7 +156,9 @@ class Jdoss extends BaseUpload $app = $this->app(); //检测桶 try { - $app->headBucket($name); + $app->headBucket([ + 'Bucket' => $name + ]); } catch (\Throwable $e) { //桶不存在返回404 if (strstr('404', $e->getMessage())) { @@ -156,7 +167,10 @@ class Jdoss extends BaseUpload } //创建桶 try { - $res = $app->createBucket($name, $region, $acl); + $res = $app->createBucket([ + 'Bucket' => $name, + 'ACL' => $acl, + ]); } catch (\Throwable $e) { if (strstr('[curl] 6', $e->getMessage())) { return $this->setError('COS:无效的区域!!');