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.mzph.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;同比…