腾讯云获取临时上传文件密钥

<?php

namespace app\adminapi\controller;

use hg\apidoc\annotation as Apidoc;
use think\facade\Config;

/**
 *
 * @Apidoc\Title("腾讯云临时密钥模块")
 *
 */
class QcloudTemporaryKey
{
    // 
    /**
     * @Apidoc\Title("获取腾讯云临时密钥接口")
     * @Apidoc\Desc("")
     * @Apidoc\Url("/adminapi/getQcloudTempKeys")
     * @Apidoc\Method("GET")
     * @Apidoc\Tag("")
     * @Apidoc\Header("Authorization", type="string",require="true", desc="授权token")
     * @Apidoc\Returned("code", type="int",default="200", desc="成功码")
     * @Apidoc\Returned("msg", type="string",default="请求成功",desc="成功或错误提示")
     * @Apidoc\Returned("data", type="object", desc="返回数据",
     *     @Apidoc\Returned("credentials", type="object",desc="",
     *      @Apidoc\Returned("sessionToken", type="string",default="", desc=""),
     *      @Apidoc\Returned("tmpSecretId", type="string",default="", desc=""),
     *      @Apidoc\Returned("tmpSecretKey", type="string",default="", desc=""),
     *  ),
     *  @Apidoc\Returned("expiredTime", type="string",default="", desc=""),
     * )
     */
    public function getQcloudTempKeys() {
        
        $config = array(
            'Url' => 'https://sts.api.qcloud.com/v2/index.php',
            'Domain' => 'sts.api.qcloud.com',
            'Proxy' => '',
            'SecretId' => Config::get('upload.qcloudcos.secret_id'), // 固定密钥
            'SecretKey' => Config::get('upload.qcloudcos.secret_key'), // 固定密钥
            'Bucket' => Config::get('upload.qcloudcos.bucket'),
            'Region' => Config::get('upload.qcloudcos.region'),//存储桶的地域
            'AllowPrefix' => '*', // 必填,这里改成允许的路径前缀,这里可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg
        );
        
        // 判断是否修改了 AllowPrefix
        if ($config['AllowPrefix'] === '_ALLOW_DIR_/*') {
            return returnErrorJson('请修改 AllowPrefix 配置项,指定允许上传的路径前缀');
        }
        
        $ShortBucketName = substr($config['Bucket'],0, strripos($config['Bucket'], '-'));
        $AppId = substr($config['Bucket'], 1 + strripos($config['Bucket'], '-'));
        $policy = array(
            'version'=> '2.0',
            'statement'=> array(
                array(
                    'action'=> array(
                        // // 这里可以从临时密钥的权限上控制前端允许的操作
                        //'name/cos:*', // 这样写可以包含下面所有权限
                        
                        // // 列出所有允许的操作
                        // // ACL 读写
                        // 'name/cos:GetBucketACL',
                        // 'name/cos:PutBucketACL',
                        // 'name/cos:GetObjectACL',
                        // 'name/cos:PutObjectACL',
                        // // 简单 Bucket 操作
                        // 'name/cos:PutBucket',
                        // 'name/cos:HeadBucket',
                        // 'name/cos:GetBucket',
                        // 'name/cos:DeleteBucket',
                        // 'name/cos:GetBucketLocation',
                        // // Versioning
                        // 'name/cos:PutBucketVersioning',
                        // 'name/cos:GetBucketVersioning',
                        // // CORS
                        // 'name/cos:PutBucketCORS',
                        // 'name/cos:GetBucketCORS',
                        // 'name/cos:DeleteBucketCORS',
                        // // Lifecycle
                        // 'name/cos:PutBucketLifecycle',
                        // 'name/cos:GetBucketLifecycle',
                        // 'name/cos:DeleteBucketLifecycle',
                        // // Replication
                        // 'name/cos:PutBucketReplication',
                        // 'name/cos:GetBucketReplication',
                        // 'name/cos:DeleteBucketReplication',
                        // // 删除文件
                        // 'name/cos:DeleteMultipleObject',
                        // 'name/cos:DeleteObject',
                        // 简单文件操作
                        'name/cos:PutObject',
                        'name/cos:PostObject',
                        'name/cos:AppendObject',
                        'name/cos:GetObject',
                        'name/cos:HeadObject',
                        'name/cos:OptionsObject',
                        'name/cos:PutObjectCopy',
                        'name/cos:PostObjectRestore',
                        // 分片上传操作
                        'name/cos:InitiateMultipartUpload',
                        'name/cos:ListMultipartUploads',
                        'name/cos:ListParts',
                        'name/cos:UploadPart',
                        'name/cos:CompleteMultipartUpload',
                        'name/cos:AbortMultipartUpload',
                    ),
                    'effect'=> 'allow',
                    'principal'=> array('qcs'=> array('*')),
                    'resource'=> array(
                        'qcs::cos:' . $config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/',
                        'qcs::cos:' . $config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/' . $this->resourceUrlEncode($config['AllowPrefix'])
                    )
                )
            )
        );
        
        $policyStr = str_replace('\\/', '/', json_encode($policy));
        $Action = 'GetFederationToken';
        $Nonce = rand(10000, 20000);
        $Timestamp = time() - 1;
        $Method = 'GET';
        
        $params = array(
            'Action'=> $Action,
            'Nonce'=> $Nonce,
            'Region'=> '',
            'SecretId'=> $config['SecretId'],
            'Timestamp'=> $Timestamp,
            'durationSeconds'=> 7200,
            'name'=> 'cos',
            'policy'=> urlencode($policyStr)
        );
        $params['Signature'] = urlencode($this->getSignature($params, $config['SecretKey'], $Method, $config));
        
        $url = $config['Url'] . '?' . $this->json2str($params);
        $ch = curl_init($url);
        $config['Proxy'] && curl_setopt($ch, CURLOPT_PROXY, $config['Proxy']);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);
        if(curl_errno($ch)) $result = curl_error($ch);
        curl_close($ch);
        
        $result = json_decode($result, 1);
        if (isset($result['data'])) $result = $result['data'];
        
        return returnSuccessJson($result);
    }
    
    // obj 转 query string
    public function json2str($obj) {
        ksort($obj);
        $arr = array();
        foreach ($obj as $key => $val) {
            array_push($arr, $key . '=' . $val);
        }
        return join('&', $arr);
    }
    
    // 计算临时密钥用的签名
    public function getSignature($opt, $key, $method, $config) {
        $formatString = $method . $config['Domain'] . '/v2/index.php?' . $this->json2str($opt);
        $formatString = urldecode($formatString);
        $sign = hash_hmac('sha1', $formatString, $key);
        $sign = base64_encode(hex2bin($sign));
        return $sign;
    }
    
    // 计算临时密钥用的签名
    public function resourceUrlEncode($str) {
        $str = rawurlencode($str);
        //特殊处理字符 !()~
        $str = str_replace('%2F', '/', $str);
        $str = str_replace('%2A', '*', $str);
        $str = str_replace('%21', '!', $str);
        $str = str_replace('%28', '(', $str);
        $str = str_replace('%29', ')', $str);
        $str = str_replace('%7E', '~', $str);
        return $str;
    }
    
}
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在LayUI中使用腾讯云对象存储服务,需要完成以下步骤: 1. 首先,在腾讯云控制台中创建一个对象存储桶,并获取该桶的密钥信息,包括SecretId、SecretKey和Token。 2. 在LayUI中引入腾讯云对象存储的JavaScript SDK,可以通过以下方式引入: ```html <script src="https://cdn.jsdelivr.net/npm/cos-js-sdk-v5/dist/cos-js-sdk-v5.min.js"></script> ``` 3. 创建一个上传文件的方法,代码如下: ```javascript function uploadToCos(file) { // 创建COS SDK实例 var cos = new COS({ SecretId: 'yourSecretId', SecretKey: 'yourSecretKey', SecurityToken: 'yourToken' }); // 上传文件 cos.putObject({ Bucket: 'yourBucketName', Region: 'yourBucketRegion', Key: file.name, Body: file, onProgress: function(progressData) { console.log(JSON.stringify(progressData)); } }, function(err, data) { if (err) { console.log(err); } else { console.log(data); } }); } ``` 其中,`yourSecretId`、`yourSecretKey`和`yourToken`分别为腾讯云对象存储的密钥信息,`yourBucketName`为对象存储桶的名称,`yourBucketRegion`为对象存储桶所在的地域。 4. 在HTML中添加一个文件选择控件和上传按钮,代码如下: ```html <input type="file" id="file-selector"> <button id="upload-btn">上传</button> ``` 5. 给上传按钮添加点击事件,调用上传文件的方法,代码如下: ```javascript document.getElementById('upload-btn').addEventListener('click', function() { var file = document.getElementById('file-selector').files[0]; uploadToCos(file); }); ``` 通过以上步骤,就可以在LayUI中使用腾讯云对象存储服务上传文件了。需要注意的是,上传文件时需要确保文件大小不超过50MB,否则需要使用分块上传。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅坞茶坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值