TencentCosService.php 4.9 KB
<?php

namespace App\Services;

use Illuminate\Http\Request;
use Illuminate\Support\Str;

/**
 * @remark :腾讯cos上传
 * @class  :TencentCosService.php
 * @author :lyh
 * @time   :2023/7/18 16:46
 */
class TencentCosService extends BaseService
{
    public $cos = [];//cos配置

    public $method = '';//请求方式

    public $time = 86400;//签名有效时间

    public $config = [
        'cosRegion' => 'COS_REGION', // 存储桶地域
        'appId' => 'COS_APP_ID', // 腾讯云应用ID
        'secretId' => 'COS_SECRET_ID', // 腾讯云API的SecretId
        'secretKey' => 'COS_SECRET_KEY', // 腾讯云API的SecretKey
        'bucket' => 'COS_BUCKET', // 存储桶名称
    ];

    public function __construct(){
        $this->cos = config('filesystems.disks.cos');
        $this->config['cosRegion'] = $this->cos['region'];
        $this->config['appId'] = $this->cos['credentials']['appId'];
        $this->config['secretId'] = $this->cos['credentials']['secretId'];
        $this->config['secretKey'] = $this->cos['credentials']['secretKey'];
        $this->config['bucket'] = $this->cos['bucket'];
    }

    /**
     * @remark :上传图片
     * @name   :upload
     * @author :lyh
     * @method :post
     * @time   :2023/7/18 16:56
     */
    public function upload_image($path,$fileName,$image_type){
        $contentType = 'image/'.$image_type;
        $httpVerb = 'PUT';
        $date = gmdate('D, d M Y H:i:s \G\M\T');
        //生成 KeyTime
        $keyTime = ( string )( time() - 60 ) . ';' . ( string )( strtotime( '+30 minutes' ) );
        //生成 SignKey
        $signKey = hash_hmac( 'sha1', $keyTime, trim($this->config['secretKey']) );
        //生成 UrlParamList 和 HttpParameters
        $queryParameters = \request()->query();
        $sortedKeys = collect($queryParameters)->keys()->sort()->all();
        $urlParamList = "";
        $httpParameters = "";
        foreach ($sortedKeys as $key) {
            $encodedKey = Str::lower(rawurlencode($key));
            $value = isset($queryParameters[$key]) ? rawurlencode($queryParameters[$key]) : "";
            $urlParamList .= $encodedKey . ";";
            $httpParameters .= $encodedKey . "=" . $value . "&";
        }
        $urlParamList = rtrim($urlParamList, ";");
        $httpParameters = rtrim($httpParameters, "&");
        // 生成 HeaderList 和 HttpHeaders
        $headers = \request()->headers->all();
        $sortedKeys = collect($headers)->keys()->sort()->all();
        $headerList = "";
        $httpHeaders = "";
        foreach ($sortedKeys as $key) {
            $encodedKey = Str::lower(rawurlencode($key));
            $value = rawurlencode($headers[$key][0]);
            $headerList .= $encodedKey . ";";
            $httpHeaders .= $encodedKey . "=" . $value . "&";
        }
        $headerList = rtrim($headerList, ";");
        $httpHeaders = rtrim($httpHeaders, "&");
        //生成HttpString
        $httpMethod = Str::lower($httpVerb);
        $uriPathname = $path.'/'.$fileName;
        $httpString = $httpMethod . "\n" . $uriPathname . "\n" . $httpParameters . "\n" . $httpHeaders . "\n";
        //生成 StringToSign
        $sha1String = sha1($httpString);
        $stringToSign = "sha1\n" . $keyTime . "\n" . $sha1String . "\n";
        $sign = hash_hmac( 'sha1', $stringToSign, $signKey );
        $authorization =
            "q-sign-algorithm=sha1&q-ak={$this->config['secretId']}&q-sign-time={$keyTime}&q-key-time={$keyTime}&q-header-list=&q-url-param-list=&q-signature={$sign}";
        $url = "https://{$this->config['bucket']}.cos.{$this->config['cosRegion']}.myqcloud.com{$uriPathname}";
        // 打开文件流
        $filePathUrl = config('filesystems.disks.upload')['root'].$path.'/'.$fileName;
        return $this->http_put($url,$contentType,$authorization,$date,$filePathUrl);
    }

    /**
     * @param Request $request
     * @remark :生成$urlParamList + $httpParameters
     * @name   :ceshi
     * @author :lyh
     * @method :post
     * @time   :2023/7/19 14:05
     */
    public function queryParameters(Request $request){

    }
    /**
     * @remark :上传文件到第三方
     * @name   : (http_put
     * @author :lyh
     * @method :post
     * @time   :2023/7/18 17:06
     */
    public function http_put($url,$contentType,$authorization,$date,$filePath){
        // 执行请求
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_PUT, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: ' . $contentType,
            'Authorization: ' . $authorization,
            'Date: ' . $date
        ));
        curl_setopt($ch, CURLOPT_INFILE, fopen($filePath, 'r'));
        curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath));

        $response = curl_exec($ch);
        curl_close($ch);
        // 检查响应结果
        if ($response) {
            return 1;
        } else {
            return 0;
        }
    }

}