thinkphp8.0上傳圖片到阿里云對象存儲(oss)

1、開通oss,并獲取accessKeyId、accessKeySecret

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>服務端生成簽名上傳文件到OSS</title>
</head>
<body>
<div class="container"><form><div class="mb-3"><label for="file" class="form-label">選擇文件:</label><input type="file" class="form-control" id="file" name="file" required /></div><button type="submit" class="btn btn-primary">上傳</button></form>
</div><script type="text/javascript">document.addEventListener('DOMContentLoaded', function () {const form = document.querySelector("form");const fileInput = document.querySelector("#file");form.addEventListener("submit", (event) => {event.preventDefault();const file = fileInput.files[0];if (!file) {alert('請選擇一個文件再上傳。');return;}const filename = file.name;fetch("/index/demo/index/", { method: "GET" }).then((response) => {if (!response.ok) {throw new Error("獲取簽名失敗");}return response.json();}).then((data) => {let formData = new FormData();formData.append("success_action_status", "200");formData.append("policy", data.policy);formData.append("x-oss-signature", data.signature);formData.append("x-oss-signature-version", "OSS4-HMAC-SHA256");formData.append("x-oss-credential", data.x_oss_credential);formData.append("x-oss-date", data.x_oss_date);formData.append("key", data.dir + file.name); // 文件名formData.append("x-oss-security-token", data.security_token);formData.append("file", file); // file 必須為最后一個表單域return fetch(data.host, {method: "POST",body: formData});}).then((response) => {if (response.ok) {console.log("上傳成功");alert("文件已上傳");} else {console.log("上傳失敗", response);alert("上傳失敗,請稍后再試");}}).catch((error) => {console.error("發生錯誤:", error);});});});
</script>
</body>
</html>

2、后端php8.3\thinkphp8.1

composer require alibabacloud/oss-v2
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Sts\Sts;
use think\response\Json;class Demo
{private function hmacsha256($key, $data): string{return hash_hmac('sha256', $data, $key, true);}public function index(): Json{$bucket = 'mj-quwei'; // 替換為您的Bucket名稱$region_id = 'cn-shanghai'; // 替換為您的Bucket所在地域$host = 'https://mj-quwei.oss-cn-shanghai.aliyuncs.com'; // 替換為您的Bucket域名$expire_time = 3600; // 過期時間,單位為秒$upload_dir = 'demo'; // 上傳文件的前綴AlibabaCloud::accessKeyClient('你的accessKeyId','你的accessKeySecret')->regionId('cn-shanghai')->asDefaultClient();// 創建STS請求。$request = Sts::v20150401()->assumeRole();// 發起STS請求并獲取結果。// 將<YOUR_ROLE_SESSION_NAME>設置為自定義的會話名稱,例如oss-role-session。// 將<YOUR_ROLE_ARN>替換為擁有上傳文件到指定OSS Bucket權限的RAM角色的ARN。$result = $request->withRoleSessionName('oss-role-session')->withDurationSeconds(3600)->withRoleArn('acs:ram::1241287589505885:role/oss-web-upload')->request();// 獲取STS請求結果中的憑證信息。$tokenData = $result->get('Credentials');// 構建返回的JSON數據。$tempAccessKeyId = $tokenData['AccessKeyId'];$tempAccessKeySecret = $tokenData['AccessKeySecret'];$securityToken = $tokenData['SecurityToken'];$now = time();$dtObj = gmdate('Ymd\THis\Z', $now);$dtObj1 = gmdate('Ymd', $now);$dtObjPlus3h = gmdate('Y-m-d\TH:i:s.u\Z', strtotime('+3 hours', $now));// 構建Policy$policy = ["expiration" => $dtObjPlus3h,"conditions" => [["x-oss-signature-version" => "OSS4-HMAC-SHA256"],["x-oss-credential" => "{$tempAccessKeyId}/{$dtObj1}/cn-shanghai/oss/aliyun_v4_request"],["x-oss-security-token" => $securityToken],["x-oss-date" => $dtObj],]];$policyStr = json_encode($policy);// 構造待簽名字符串$stringToSign = base64_encode($policyStr);// 計算SigningKey$dateKey = $this->hmacsha256(('aliyun_v4' . $tempAccessKeySecret), $dtObj1);$dateRegionKey = $this->hmacsha256($dateKey, 'cn-shanghai');$dateRegionServiceKey = $this->hmacsha256($dateRegionKey, 'oss');$signingKey = $this->hmacsha256($dateRegionServiceKey, 'aliyun_v4_request');// 計算Signature$result = $this->hmacsha256($signingKey, $stringToSign);$signature = bin2hex($result);// 返回簽名數據$responseData = ['policy' => $stringToSign,'x_oss_signature_version' => "OSS4-HMAC-SHA256",'x_oss_credential' => "{$tempAccessKeyId}/{$dtObj1}/cn-shanghai/oss/aliyun_v4_request",'x_oss_date' => $dtObj,'signature' => $signature,'host' => $host,'dir' => $upload_dir,'security_token' => $securityToken];return json($responseData);}public function demo(){return view('/index');}
}

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

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

相關文章

跳躍連接(Skip Connection)與殘差連接(Residual Connection)

1. 跳躍連接&#xff08;Skip Connection&#xff09;的基本概念 跳躍連接是一種在深度神經網絡中廣泛應用的技術&#xff0c;它允許信息在網絡中跨層直接傳遞。在傳統的神經網絡里&#xff0c;每一層的輸出僅僅是前一層輸出經過特定變換后的結果。而在具備跳躍連接的網絡中&a…

【硬件視界9】網絡硬件入門:從網卡到路由器

??引言: 專欄:《硬件視界》 【硬件視界8】電源供應器(PSU):計算機的“心臟“ 在數字化高速發展的今天,網絡已成為我們日常生活和工作中不可或缺的基礎設施。而支撐這一基礎設施的核心要素,便是各種各樣的網絡硬件設備。從連接計算機到網絡的網絡適配器,到負責數據轉發與…

最小生成樹理論

1. 基本定義 生成樹&#xff1a;在一個連通無向圖中&#xff0c;一個生成樹是包含所有頂點且邊數為 n?1&#xff08;n為頂點數&#xff09;的無環連通子圖。 最小生成樹&#xff1a;在所有生成樹中&#xff0c;邊權和最小的那一棵樹。也就是說&#xff0c;若每條邊有一個非負…

STM32 HAL庫 CANFD配置工具

用法說明&#xff1a; 該工具適用于STM32HAL庫&#xff0c;可一鍵生成CANFD的HAL庫配置代碼。計算依據為HAL庫&#xff0c;并參考ZLG標準。 軟件界面&#xff1a; 倉庫地址&#xff1a; HAL CANFD Init Gen: 適用于STM32控制器的HAL庫 版本說明&#xff1a; V1.2.0 &#x…

【11408學習記錄】考研英語長難句解析 | 語法拆分+寫作模板+真題精講(附高分秘籍)

2025.04.05 英語語法總結——長難句并列句并列連詞并列句的省略 寫作書信寫作第二段注意 第三段落款 每日一句詞匯第一步&#xff1a;辨別第二步&#xff1a;斷開第三步&#xff1a;簡化 英語 語法總結——長難句 長難句有兩個特點&#xff1a;長、難。 之所以又長又難就是因…

實用的alias別名命令——比2=1+1簡單的基礎命令

目錄 alias命令的用處alias命令的寫法讓alias別名永久存在的辦法下篇預告 alias命令的用處 別名&#xff0c;就是linux系統中的命令的別稱&#xff0c;而alias命令&#xff0c;可以顯示linux系統當前設定的全部別名&#xff0c;當然&#xff0c;也可以自己定義一個別名。 ali…

Kafka 中的批次

在 Kafka 中&#xff0c;批次&#xff08;Batch&#xff09; 是生產者發送消息的一個重要概念。它對 Kafka 的性能、吞吐量、延遲等有很大影響。批量處理可以使消息發送更高效&#xff0c;減少網絡往返和磁盤寫入的開銷。 下面我將詳細解釋 Kafka 中的批次機制&#xff0c;包括…

聯合、枚舉、類型別名

數據類型&#xff1a; 已學--整數、實數、字符、字符串、數組、指針、結構待學--向量&#xff08;vector&#xff09;類型&#xff1a;優于數組非主流的類型--聯合&#xff08;union&#xff09;、枚舉&#xff08;enum&#xff09; 一、聯合 聯合類似于結構&#xff0c;可以容…

form+ffmpeg+opus錄音壓縮音頻

說明&#xff1a; formffmpegopus錄音壓縮音頻 效果圖&#xff1a; step1:opus格式錄音 C:\Users\wangrusheng\RiderProjects\WinFormsApp11\WinFormsApp11\Form1.cs using System; using System.Diagnostics; using System.IO; using System.Windows.Forms;namespace WinFo…

軟件工程面試題(三十)

將ISO8859-1字符串轉成GB2312編碼&#xff0c;語句為&#xff1f; String snew String(text.getBytes(“iso8859-1”),”gb2312”). 說出你用過的J2EE標準的WEB框架和他們之間的比較&#xff1f; 答&#xff1a;用過的J2EE標準主要有&#xff1a;JSP&Servlet、JDBC、JNDI…

每日一題(小白)分析娛樂篇10

由題知計算階乘之和&#xff0c;我們可以用for循環計算每一次的值把總和放在BigInteger然后進行判斷。但是這樣明顯過于麻煩&#xff0c;我們可以利用數學的本質去思考這個問題&#xff0c;以0結尾的數字乘以一個數字必定為0&#xff0c;階乘之中必定有2和5結尾的數字相乘得0&a…

【51單片機】2-3【I/O口】震動傳感器控制LED燈

1.硬件 51最小系統LED燈模塊震動傳感器模塊 2.軟件 #include "reg52.h"sbit led1 P3^7;//根據原理圖&#xff08;電路圖&#xff09;&#xff0c;設備變量led1指向P3組IO口的第7口 sbit vibrate P3^3;//震動傳感器DO接P3.3口void Delay2000ms() //11.0592MHz {…

Linux網絡狀態監控利器:netstat與ping命令詳解

網絡狀態監控利器&#xff1a;netstat與ping命令詳解 在Linux系統的網絡管理中&#xff0c;實時監控網絡狀態是確保系統穩定運行的關鍵環節。netstat和ping作為兩個常用的網絡監控工具&#xff0c;分別提供了詳細的網絡狀態信息和網絡連通性檢測功能。本文將全面解析這兩個命令…

【spring cloud Netflix】Eureka注冊中心

1.概念 Eureka就好比是滴滴&#xff0c;負責管理、記錄服務提供者的信息。服務調用者無需自己尋找服務&#xff0c;而是把自己的 需求告訴Eureka&#xff0c;然后Eureka會把符合你需求的服務告訴你。同時&#xff0c;服務提供方與Eureka之間通過“心跳” 機制進行監控&#xf…

Linux中C++ gdb調試命令

編譯可執行文件需要帶上-g選項參數 輸入回車則重復執行上一次命令&#xff1b; 進入gdb&#xff1a; gdb 程序名運行gdb命令&#xff1a; r打斷點命令&#xff1a; b 行號查看斷點命令&#xff1a; i b打印變量命令&#xff1a; p 變量名持續查看變量命令&#xff1a; d…

【進收藏夾吃灰】機器學習學習指南

博客標題URL【機器學習】線性回歸&#xff08;506字&#xff09;https://blog.csdn.net/from__2025_03_16/article/details/146303423

【通信觀察家】2025年Q1通信業技術躍遷與生態重構:AI+低空經濟雙輪驅動

一、行業動態與投資熱點 1. 算力投資加速 1) 騰訊2024年財報顯示&#xff0c;AI相關資本開支同比增長221.27%&#xff0c;2025年計劃繼續加碼AI原生應用研發及算力基礎設施建設&#xff0c;其自研混元T1模型(Hybrid-Mamba-Transformer架構)已上線并開放云服務。 2) 中國移動和…

基于 Vue + Django + MySQL 實現個人博客/CMS系統

目錄 1. 環境搭建與項目初始化 后端 (Django) 2. 數據庫模型設計 用戶認證模型 (Django Auth) 文章模型 (models.py) 全文索引優化 3. 后端API開發 (Django REST Framework) 用戶注冊/登錄 文章發布與搜索 4. 前端實現 (Vue 3) 項目初始化 核心功能實現 5. 訪問統…

從全球首發到獨家量產,遠峰科技持續領跑數字鑰匙賽道

數字車鑰匙「新紀元」即將開啟&#xff0c;星閃數字鑰匙正式進入量產周期。 隨著汽車智能化快速普及&#xff0c;數字鑰匙的搭載量正在快速提升。根據高工智能汽車研究院的數據&#xff0c;2024年中國市場乘用車前裝標配搭載數字鑰匙的新車交付量超過1000萬輛&#xff0c;同比…