vue、thinkphp實現騰訊云對象存儲COS圖片上傳

  • 環境:
    thinkphp6
    vue2
    vant2.12

  • composer安裝qcloud-sts-sdk

composer require qcloud_sts/qcloud-sts-sdk
  • 獲取COS臨時id、key的sts接口
<?php
declare (strict_types = 1);namespace app\index\controller;
use QCloud\COSSTS\Sts;class CosController
{//http://localhost:8516/index/cos/stspublic function sts() {$sts = new Sts();$config = array('url' => 'https://sts.tencentcloudapi.com/', // url和domain保持一致'domain' => 'sts.tencentcloudapi.com', // 域名,非必須,默認為 sts.tencentcloudapi.com'proxy' => '','secretId' => 'xxxx', // 固定密鑰,若為明文密鑰,請直接以'xxx'形式填入,不要填寫到getenv()函數中'secretKey' => 'xxxx', // 固定密鑰,若為明文密鑰,請直接以'xxx'形式填入,不要填寫到getenv()函數中'bucket' => 'test-1253653367',//'test-1253653367', // 換成你的 bucket'region' => 'ap-shanghai', // 換成 bucket 所在園區'durationSeconds' => 1800, // 密鑰有效期'allowPrefix' => array('2024/msc2024/*'), // 這里改成允許的路徑前綴,可以根據自己網站的用戶登錄態判斷允許上傳的具體路徑,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全風險, 請謹慎評估使用)// 密鑰的權限列表。簡單上傳和分片需要以下的權限,其他權限列表請看 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'),// 臨時密鑰生效條件,關于condition的詳細設置規則和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 {//     // 可能拋出異常的代碼//     // 獲取臨時密鑰,計算簽名//     $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.filevar that = thisvar that = thisvar cosBucket = 'test-123456'var cosRegion = 'ap-shanghai'var cosPrefix = '2024/msc2024'let name = file.namelet size = file.sizelet ext = getFilePointExtName(name)let shortName = getFileName(name)let fileName = 'upload/' + getStrDateNoLine(new Date()) + "/" + uuid() + extlet fileKey = cosPrefix + '/' + fileNameif(ext!= '.jpg' && ext!= '.JPG' && ext!= '.png' && ext!= '.PNG') {//this.$Message.error('請上傳jpg格式文件');vant.Toast('請上傳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 必選參數getAuthorization: function (options, callback) {// 初始化時不會調用,只有調用 cos 方法(例如 cos.putObject)時才會進入// 異步獲取臨時密鑰// 服務端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/// 服務端其他語言參考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk// STS 詳細文檔指引看:https://cloud.tencent.com/document/product/436/14048const url = '/index/cos/sts'; // url 替換成您自己的后端服務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,// 建議返回服務器時間作為簽名的開始時間,避免用戶瀏覽器本地時間偏差過大導致簽名錯誤StartTime: data.startTime, // 時間戳,單位秒,如:1580000000ExpiredTime: data.expiredTime, // 時間戳,單位秒,如:1580000000});};xhr.send();}});}// var cos = new COS({//   SecretId: 'xx',//   SecretKey: 'xx',// });that.isProcessVisible = truethat.process = 0this.cos.uploadFile({Bucket: cosBucket, /* 填寫自己的bucket,必須字段 */Region: cosRegion,     /* 存儲桶所在地域,必須字段 */Key: fileKey,              /* 存儲在桶里的對象鍵(例如:1.jpg,a/b/test.txt,圖片.jpg)支持中文,必須字段 */Body: file, // 上傳文件對象SliceSize: 1024 * 1024 * 5,     /* 觸發分塊上傳的閾值,超過5MB使用分塊上傳,小于5MB使用簡單上傳。可自行設置,非必須 */onProgress: function(progressData) {//console.log(JSON.stringify(progressData));that.process = Math.floor(progressData.percent*100)}}, function(err, data) {that.isProcessVisible = falseif (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;//獲取當前月份的日期 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());
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何為PostgreSQL設置自增主鍵?

在 PostgreSQL 中&#xff0c;自增主鍵通常是通過使用 SERIAL 類型或在新版本中使用 IDENTITY 列來實現的。 1. 使用 SERIAL 類型 SERIAL 是一個自動增加的整數&#xff0c;常用于主鍵。當插入新的行時&#xff0c;PostgreSQL 會自動為這個列生成一個新的值。 ??例如 CREAT…

PYQT5-自定義事件

from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication import sys# 自定義事件類 class CustomEvent(QEvent):# PYQT5 預留給用戶自定義事件類型的起點為 QEvent.User1000custom_event_type QEvent.registerEventType()# 也可以這樣寫# custom…

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//標記數組 int a[N][N];//儲存數組 int dx[] { -1…

webstorm光標變成方塊解決辦法_webstorm光標變粗不能換行

webstorms光標變了 鍵盤上的insert是切換的快捷鍵&#xff0c;敲insert就可以來回切換了

回顧 | Java面向對象 多態篇

多態是面向對象編程中的一個重要概念&#xff0c;它允許不同的對象對同一消息做出不同的響應。 通過多態&#xff0c;可以通過父類或接口定義的引用變量來操作子類或實現類的對象&#xff0c;從而實現同一方法在不同對象上的不同行為。 在Java中&#xff0c;多態性主要通過繼…

雙通道并行網絡,想用哪個網絡用哪個,MATLAB代碼

本期可謂是寶藏篇&#xff01;學會本期的思想&#xff0c;幫助你分分鐘找到創新點&#xff0c;且不與別人重復&#xff01; 本期采用MATLAB代碼&#xff0c;實現一種“基于格拉姆角場與并行CNN的故障診斷方法”。該方法的具體實現可以參考文獻&#xff1a; [1]李宗源,陳謙,錢…

React native更改包名后,啟動app的activity包名不生效問題

這篇文章本不算記錄的&#xff0c;因為實際開發中&#xff0c;類似這種小問題會有很多很多&#xff0c;因為導致問題的原因千奇百怪&#xff0c;解決方案也不盡相同&#xff0c;所以也都沒有記錄。 但今天看到我10年寫的問題解決小文章&#xff0c;被網友收藏了&#xff0c; 感…

普中51單片機學習(EEPROM)

EEPROM IIC串行總線的組成及工作原理 I2C總線的數據傳送 數據位的有效性規定 I2C總線進行數據傳送時&#xff0c;時鐘信號為高電平期間&#xff0c;數據線上的數據必須保持穩定&#xff0c;只有在時鐘線上的信號為低電平期間&#xff0c;數據線上的高電平或低電平狀態才允許…

分享WebGL物體三維建模

界面效果 代碼結構 模型素材類似CT (Computed Tomography)&#xff0c;即電子計算機斷層掃描&#xff0c;它是利用精確準直的X線束、γ射線、超聲波等&#xff0c;與靈敏度極高的探測器一同圍繞物體的某一部位作一個接一個的斷面掃描。 坐標系統 渲染流程 渲染流程是個將之前準…

Sora:OpenAI引領AI視頻新時代

Sora - 探索AI視頻模型的無限可能 隨著人工智能技術的飛速發展&#xff0c;AI視頻模型已成為科技領域的新熱點。而在這個浪潮中&#xff0c;OpenAI推出的首個AI視頻模型Sora&#xff0c;以其卓越的性能和前瞻性的技術&#xff0c;引領著AI視頻領域的創新發展。讓我們將一起探討…

C++(12) 模板類、模板繼承(嚴格模式和自由模式)

文章目錄 模版類1. 模版類2. 模版參數限制3. 模版繼承3.1 嚴格模式3.2 自由模式 4. 模版類的模版函數5. 返回值類型帶有模版 模版類 1. 模版類 #include <iostream>using namespace std;/* 當前 Person 類型&#xff0c;聲明了連個模版分別對應NameType 模版類型&#…

C++ array容器用法詳解

array 容器是 C++ 11 標準中新增的序列容器,簡單地理解,它就是在 C++ 普通數組的基礎上,添加了一些成員函數和全局函數。在使用上,它比普通數組更安全(原因后續會講),且效率并沒有因此變差。 和其它容器不同,array 容器的大小是固定的,無法動態的擴展或收縮,這也就意…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 實現微服務的限流、降級、熔斷

目錄 一、Sentinel 介紹1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降級與熔斷的區別 二、實戰演示2.1 下載啟動 Sentinel 控制臺2.2 后端微服務接入 Sentinel 控制臺2.2.1 引入 Sentinel 依賴2.2.2 添加 Sentinel 連接配置 2.3 使用 Sentinel 進行流控&#xff08;含限流…

SLAM ORB-SLAM2(19)特征點三角化

SLAM ORB-SLAM2(19)特征點三角化 1. 前言2. 初始化參數3. 計算投影矩陣4. 恢復三維點4.1. 計算推導4.2. Triangulate5. 檢查三維點5.1. 檢查三維點的深度值和視差角5.2. 檢查空間點的重投影誤差6. 最后處理1. 前言 在 《SLAM ORB-SLAM2(12)估算運動并初始地圖點》 中了解到…

如何將cocos2d-x js打包部署到ios上 Mac M1系統

項目環境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的項目 使用xcode軟件打開上面這個文件 打開后應該是這個樣子 執行編譯運行就好了 可能會碰到的錯誤 在xcode11版本以上都會有這個錯誤&#xff0c;這是因為iOS11廢棄了system。 將上面代碼修改為 #if (CC_TARGE…

Java 面向對象進階 16 接口的細節:成員特點和接口的各種關系(黑馬)

成員變量默認修飾符是public static final的原因是&#xff1a; Java中接口中成員變量默認修飾符是public static final的原因是為了確保接口的成員變量都是公共的、靜態的和不可修改的。 - public修飾符確保了接口的成員變量可以在任何地方被訪問到。 - static修飾符使得接口…

vue-利用屬性(v-if)控制表單(el-form-item)顯示/隱藏

表單控制屬性 v-if 示例&#xff1a; 通過switch組件作為開關&#xff0c;控制表單的顯示與隱藏 <el-form-item label"創建數據集"><el-switch v-model"selectFormVisible"></el-switch></el-form-item><el-form-item label&…

Redis篇----第七篇

系列文章目錄 文章目錄 系列文章目錄前言一、Redis 的回收策略(淘汰策略)?二、為什么 edis 需要把所有數據放到內存中?三、Redis 的同步機制了解么?四、Pipeline 有什么好處,為什么要用 pipeline?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍…

crontab history查看命令的執行時間

crontab crontab學習網站&#xff08;19. crontab 定時任務 — Linux Tools Quick Tutorial&#xff09; 例子 今天實際工作里用到的&#xff08;已經進行了防信息泄露處理 比如我現在希望每周三上午10:00之行一個php腳本 --gpt生成 00 10 * * 3 cd /home/user/project/r…

阿里云SSL免費證書到期自動申請部署程序

阿里云的免費證書只有3個月的有效期&#xff0c;不注意就過期了&#xff0c;還要手動申請然后部署&#xff0c;很是麻煩&#xff0c;于是寫了這個小工具。上班期間抽空寫的&#xff0c;沒有仔細測試&#xff0c;可能存在一些問題&#xff0c;大家可以自己clone代碼改改&#xf…