vue thinkphp實(shí)現(xiàn)騰訊云對(duì)象存儲(chǔ)COS圖片上傳

  • 環(huán)境:
    thinkphp6
    vue2
    vant2.12
  • composer安裝qcloud-sts-sdk
composer require qcloud_sts/qcloud-sts-sdk
  • 獲取COS臨時(shí)id执解、key的sts接口
<?php
declare (strict_types = 1);

namespace app\index\controller;
use QCloud\COSSTS\Sts;

class CosController
{

    //http://localhost:8516/index/cos/sts
    public function sts() {
        $sts = new Sts();
        $config = array(
            'url' => 'https://sts.tencentcloudapi.com/', // url和domain保持一致
            'domain' => 'sts.tencentcloudapi.com', // 域名厨相,非必須,默認(rèn)為 sts.tencentcloudapi.com
            'proxy' => '',
            'secretId' => 'xxxx', // 固定密鑰,若為明文密鑰仓手,請(qǐng)直接以'xxx'形式填入,不要填寫到getenv()函數(shù)中
            'secretKey' => 'xxxx', // 固定密鑰,若為明文密鑰,請(qǐng)直接以'xxx'形式填入,不要填寫到getenv()函數(shù)中
            'bucket' => 'test-1253653367',//'test-1253653367', // 換成你的 bucket
            'region' => 'ap-shanghai', // 換成 bucket 所在園區(qū)
            'durationSeconds' => 1800, // 密鑰有效期
            'allowPrefix' => array('2024/msc2024/*'), // 這里改成允許的路徑前綴润匙,可以根據(jù)自己網(wǎng)站的用戶登錄態(tài)判斷允許上傳的具體路徑,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全風(fēng)險(xiǎn), 請(qǐng)謹(jǐn)慎評(píng)估使用)
            // 密鑰的權(quán)限列表唉匾。簡單上傳和分片需要以下的權(quán)限孕讳,其他權(quán)限列表請(qǐng)看 https://cloud.tencent.com/document/product/436/31923
            'allowActions' => array (
                // 簡單上傳
                'name/cos:PutObject',
                'name/cos:PostObject',
                // 分片上傳
                'name/cos:InitiateMultipartUpload',
                'name/cos:ListMultipartUploads',
                'name/cos:ListParts',
                'name/cos:UploadPart',
                'name/cos:CompleteMultipartUpload'
            ),
            // 臨時(shí)密鑰生效條件,關(guān)于condition的詳細(xì)設(shè)置規(guī)則和COS支持的condition類型可以參考 https://cloud.tencent.com/document/product/436/71306
            // "condition" => array(
            //     "ip_equal" => array(
            //         "qcs:ip" => array(
            //             "10.217.182.3/24",
            //             "111.21.33.72/24",
            //         )
            //     )
            // )
        );

        $tempKeys = $sts->getTempKeys($config);
        //echo json_encode($tempKeys);
        return json($tempKeys);

        // try {
        //     // 可能拋出異常的代碼
        //     // 獲取臨時(shí)密鑰巍膘,計(jì)算簽名
        //     $tempKeys = $sts->getTempKeys($config);
        //     //echo json_encode($tempKeys);
        //     return json($tempKeys);
        // } catch (\Throwable $e) {
        //     // 異常處理代碼
        //     return json(array('code'=>101, 'msg'=>$e->getMessage()));
        // }
    }
}

前端vue2代碼,使用vant的文件上傳組件

<van-uploader :after-read="handleUpload"></van-uploader>
data: {
  process: 0,
  isProcessVisible: false,
  uploadType: null, //1人像 2國徽 3自拍
  cos: null
}
handleUpload: function (res) {
  var file = res.file
  var that = this
  var that = this
  var cosBucket = 'test-123456'
  var cosRegion = 'ap-shanghai'
  var cosPrefix = '2024/msc2024'
  let name = file.name
  let size = file.size
  let ext = getFilePointExtName(name)
  let shortName = getFileName(name)
  let fileName = 'upload/' + getStrDateNoLine(new Date()) + "/" + uuid() + ext
  let fileKey = cosPrefix + '/' + fileName

  if(ext!= '.jpg' && ext!= '.JPG' && ext!= '.png' && ext!= '.PNG') {
    //this.$Message.error('請(qǐng)上傳jpg格式文件');
    vant.Toast('請(qǐng)上傳jpg或png格式文件');
    return
  }

  if(size > 1024*1024*2) {
    vant.Toast('圖片文件不要大于2M');
    return
  }
  //alert(fileName)
  //console.log(file)
  if(this.cos == null) {
    this.cos = new COS({
      // getAuthorization 必選參數(shù)
      getAuthorization: function (options, callback) {
        // 初始化時(shí)不會(huì)調(diào)用厂财,只有調(diào)用 cos 方法(例如 cos.putObject)時(shí)才會(huì)進(jìn)入
        // 異步獲取臨時(shí)密鑰
        // 服務(wù)端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
        // 服務(wù)端其他語言參考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
        // STS 詳細(xì)文檔指引看:https://cloud.tencent.com/document/product/436/14048
        const url = '/index/cos/sts'; // url 替換成您自己的后端服務(wù)
        const xhr = new XMLHttpRequest();
        let data = null;
        let credentials = null;
        xhr.open('GET', url, true);
        xhr.onload = function (e) {
            try {
              data = JSON.parse(e.target.responseText);
              credentials = data.credentials;
            } catch (e) {
            }
            if (!data || !credentials) {
              return console.error('credentials invalid:\n' + JSON.stringify(data, null, 2))
            };
            callback({
              TmpSecretId: credentials.tmpSecretId,
              TmpSecretKey: credentials.tmpSecretKey,
              SecurityToken: credentials.sessionToken,
              // 建議返回服務(wù)器時(shí)間作為簽名的開始時(shí)間,避免用戶瀏覽器本地時(shí)間偏差過大導(dǎo)致簽名錯(cuò)誤
              StartTime: data.startTime, // 時(shí)間戳峡懈,單位秒璃饱,如:1580000000
              ExpiredTime: data.expiredTime, // 時(shí)間戳,單位秒肪康,如:1580000000
          });
        };
        xhr.send();
      }
    });
  }

  // var cos = new COS({
  //   SecretId: 'xx',
  //   SecretKey: 'xx',
  // });
  that.isProcessVisible = true
  that.process = 0
  this.cos.uploadFile({
    Bucket: cosBucket, /* 填寫自己的bucket荚恶,必須字段 */
    Region: cosRegion,     /* 存儲(chǔ)桶所在地域,必須字段 */
    Key: fileKey,              /* 存儲(chǔ)在桶里的對(duì)象鍵(例如:1.jpg磷支,a/b/test.txt谒撼,圖片.jpg)支持中文,必須字段 */
    Body: file, // 上傳文件對(duì)象
    SliceSize: 1024 * 1024 * 5,     /* 觸發(fā)分塊上傳的閾值雾狈,超過5MB使用分塊上傳廓潜,小于5MB使用簡單上傳。可自行設(shè)置辩蛋,非必須 */
    onProgress: function(progressData) {
      //console.log(JSON.stringify(progressData));
      that.process = Math.floor(progressData.percent*100)
    }
  }, function(err, data) {
    that.isProcessVisible = false
    if (err) {
      console.log('上傳失敗', err);
    } else {
      console.log('上傳成功');
      console.log('http://' + data.Location)
        var url = 'http://' + data.Location.replace("xxxx.cos.ap-shanghai.myqcloud.com", "cdn.xxx.xxx.com")
      console.log(url)
    }
  });
  return false
},
  • 用到的其它方法
function getFileName(fileName) {
  let pos = fileName.indexOf(".")
  if(pos >= 0) {
    return fileName.substr(0, pos)
  }
  return fileName
}

function getFileExtName(fileName) {
  let pos = fileName.indexOf(".")
  if(pos >= 0) {
    return fileName.substr(pos+1)
  }
  return ''
}

function getFilePointExtName(fileName) {
  var ext = getFileExtName(fileName)
  if(ext != '') {
    return '.' + ext
  }
  return ''
}

function getStrDateNoLine(date) {
  var y = date.getFullYear();
  var m = date.getMonth() + 1;//獲取當(dāng)前月份的日期 
  var d = date.getDate();
  if (m < 10) {
    m = '0' + m;
  }
  if (d < 10) {
    d = '0' + d;
  }
  return y + "" + m + "" + d;
}

//用于生成uuid
function S4() {
  return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}

function uuid() {
  return (S4() + S4() + "" + S4() + "" + S4() + "" + S4() + "" + S4() + S4() + S4());
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呻畸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堪澎,更是在濱河造成了極大的恐慌擂错,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱蛤,死亡現(xiàn)場(chǎng)離奇詭異钮呀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昨凡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門爽醋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人便脊,你說我怎么就攤上這事蚂四。” “怎么了哪痰?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵遂赠,是天一觀的道長。 經(jīng)常有香客問我晌杰,道長跷睦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任肋演,我火速辦了婚禮抑诸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爹殊。我一直安慰自己蜕乡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布梗夸。 她就那樣靜靜地躺著层玲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反症。 梳的紋絲不亂的頭發(fā)上辛块,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音惰帽,去河邊找鬼憨降。 笑死父虑,一個(gè)胖子當(dāng)著我的面吹牛该酗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼呜魄,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悔叽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爵嗅,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤娇澎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睹晒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趟庄,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年伪很,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戚啥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锉试,死狀恐怖猫十,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呆盖,我是刑警寧澤拖云,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站应又,受9級(jí)特大地震影響宙项,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丁频,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一杉允、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧席里,春花似錦叔磷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咖为,卻和暖如春秕狰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躁染。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工鸣哀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吞彤。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓我衬,卻偏偏與公主長得像叹放,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挠羔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容