123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- <?php
- namespace app\utils\Service\Tencent;
- use Qcloud\Cos\Client;
- use QCloud\COSSTS\Sts;
- class CosService
- {
- private $config;
- public function __construct()
- {
- $this->config = get_addon_config('cos');
- }
- public function getToken()
- {
- $config = $this->stsToken();
- $uploadUrl = $this->config['uploadurl'];
- $cdnUrl = $this->config['cdnurl'];
- $appId = $this->config['appId'] ?? '';
- $bucket = $this->config['bucket'] ?? '';
- $region = $this->config['region'] ?? '';
- $key = str_replace('-'.$appId,'',$bucket);
- $tmpSecretId = $config['credentials']['tmpSecretId'];
- $tmpSecretKey = $config['credentials']['tmpSecretKey'];
- $tmpToken = $config['credentials']['sessionToken'];
- $cosClient = new Client(
- array(
- 'region' => $region,
- 'scheme' => 'https',
- 'signHost' => true,
- 'credentials'=> array(
- 'secretId' => $tmpSecretId,
- 'secretKey' => $tmpSecretKey,
- 'token' => $tmpToken)));
-
- try {
- $signedUrl = $cosClient->getPreSignedUrl('putObject', array(
- 'Bucket' => $bucket,
- 'Key' => $key,
- 'Body' => 'string',
- 'Params'=> array(),
- 'Headers'=> array(),
- ), '+10 minutes');
-
-
- return [true,[
- 'bucket' => $bucket,
- 'region' => $region,
- 'uploadUrl' => $uploadUrl,
- 'cdnUrl' => $cdnUrl,
- 'signUrl' => $signedUrl,
- ]];
- } catch (\Exception $e) {
-
- return [false,$e->getMessage()];
- }
- }
-
- public function getSignedUrl($dir = 'uploads/')
- {
- $uploadUrl = $this->config['uploadurl'];
- $cdnUrl = $this->config['cdnurl'];
- $secretId = $this->config['secretId'] ?? '';
- $secretKey = $this->config['secretKey'] ?? '';
- $bucket = $this->config['bucket'] ?? '';
- $region = $this->config['region'] ?? '';
- $time = time();
- try {
-
- $addTime = 30 * 60;
- $expiration = $this->gmt_iso8601($time + $addTime);
- $StartTimestamp = $time;
- $EndTimestamp = $StartTimestamp + $addTime;
- $KeyTime = "$StartTimestamp;$EndTimestamp";
- $conditions = [
- ['content-length-range', 0, 1048576000],
- ["bucket" => $bucket],
- ["starts-with", '$key', $dir],
- ["q-sign-algorithm" => "sha1"],
- ["q-ak" => $secretId],
- ["q-sign-time" => $KeyTime]
- ];
- $arr = ['expiration' => $expiration, 'conditions' => $conditions];
- $policy = json_encode($arr);
- $policyBase64 = base64_encode($policy);
-
- $SignKey = hash_hmac('sha1', $KeyTime, $secretKey);
- $StringToSign = sha1($policy);
- $Signature = hash_hmac('sha1', $StringToSign, $SignKey);
-
- return [true, [
- 'upload_url' => $uploadUrl,
- 'cdn_url' => $cdnUrl,
- 'region' => $region,
- 'policy' => $policyBase64,
- 'q_sign_algorithm' => 'sha1',
- 'q_ak' => $secretId,
- 'q_key_time' => $KeyTime,
- 'q_signature' => $Signature,
- ]];
- } catch (\Exception $e) {
- return [false, $e->getMessage()];
- }
- }
- public function stsToken()
- {
- $uploadUrl = $this->config['uploadurl'];
- $cdnUrl = $this->config['cdnurl'];
- $secretId = $this->config['secretId'] ?? '';
- $secretKey = $this->config['secretKey'] ?? '';
- $bucket = $this->config['bucket'] ?? '';
- $region = $this->config['region'] ?? '';
- $sts = new Sts();
- $config = array(
- 'url' => 'https://sts.tencentcloudapi.com/',
- 'domain' => 'sts.tencentcloudapi.com',
- 'proxy' => '',
- 'secretId' => $secretId,
- 'secretKey' => $secretKey,
- 'bucket' => $bucket,
- 'region' => $region,
- 'durationSeconds' => 1800,
- 'allowPrefix' => array('exampleobject.jpg','exampleobject.png','exampleobject/*'),
-
- 'allowActions' => array (
-
- 'name/cos:PutObject',
- 'name/cos:PostObject',
-
- 'name/cos:InitiateMultipartUpload',
- 'name/cos:ListMultipartUploads',
- 'name/cos:ListParts',
- 'name/cos:UploadPart',
- 'name/cos:CompleteMultipartUpload'
- ),
-
- );
- $tempKeys = $sts->getTempKeys($config);
- return $tempKeys;
- }
- private function xml_parser($str)
- {
- $xml_parser = xml_parser_create();
- if (!xml_parse($xml_parser, $str, true)) {
- xml_parser_free($xml_parser);
- return $str;
- } else {
- $res = json_decode(json_encode(simplexml_load_string($str, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
- return $res['Message'] ?? '请求错误';
- }
- }
-
- private function gmt_iso8601($time)
- {
- $dtStr = date("c", $time);
- $dateTime = new \DateTime($dtStr);
- $expiration = $dateTime->format(\DateTime::ISO8601);
- $pos = strpos($expiration, '+');
- $expiration = substr($expiration, 0, $pos);
- return $expiration . "Z";
- }
- }
|