TencentCosService.php 3.3 KB
<?php

namespace App\Services;

use Illuminate\Http\Request;

/**
 * @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
        $signTime = ( string )( time() - 60 ) . ';' . ( string )( strtotime( '+30 minutes' ) );
        //生成 SignKey
        $signKey = hash_hmac( 'sha1', $signTime, trim($this->config['secretKey']) );
        //生成 UrlParamList 和 HttpParameters
        $filePath = $path.'/'.$fileName;
        $stringToSign = "{$httpVerb}\n\n\n{$date}\n/{$this->config['bucket']}/{$filePath}";
        $sign = hash_hmac( 'sha1', $stringToSign, $signKey );
        $authorization =
            "q-sign-algorithm=sha1&q-ak={$this->config['secretId']}&q-sign-time={$signTime}&q-key-time={$signTime}&q-header-list=&q-url-param-list=&q-signature={$sign}";
        $url = "https://{$this->config['bucket']}.cos.{$this->config['cosRegion']}.myqcloud.com{$filePath}";
        // 打开文件流
        $filePathUrl = config('filesystems.disks.upload')['root'].$path.'/'.$fileName;
        return $this->http_put($url,$contentType,$authorization,$date,$filePathUrl);
    }

    /**
     * @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) {
            var_dump($response);
            die();
            return 1;
        } else {
            return 0;
        }
    }

}