当前位置: 首页 > news >正文

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.dtcms.com/a/113058.html

相关文章:

  • 2025全新开源双端系统源码:获取通讯录、相册、短信、定位及已装应用信息
  • 程序环境和预处理
  • 第二章日志分析-redis应急响应笔记
  • 贪心算法的使用条件
  • 通义灵码:引领 AI 驱动的编程革命
  • 趣味逆商测试:了解你的逆境应对能力
  • 系统思考:思考的快与慢
  • 二叉树的前序中序后序遍历
  • DeFi漏洞利用与安全防护
  • Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>
  • Python 变量
  • JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)
  • 31信号和槽_信号和槽存在的意义(1)
  • bge-m3+deepseek-v2-16b+离线语音能力实现离线文档向量化问答语音版
  • AI绘画中的LoRa是什么?
  • Maven 远程仓库推送方法
  • Redis内存碎片详解!
  • samba共享配置
  • CodeCraft-22 and Codeforces Round 795 (Div. 2) D
  • 【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析
  • Nginx介绍及使用
  • 美团滑块 分析
  • 【问题记录】C语言一个程序bug定位记录?(定义指针数组忘记[])
  • Pgvector的安装
  • 为什么AI需要向量数据库?
  • Redis数据结构之Hash
  • 如何通过共同训练 LLAMA3(大语言模型)与 GAT(图注意力网络)来实现检索增强生成(RAG),用于基于知识图谱信息回答问题
  • 【算法实践】算法面试常见问题——数组的波浪排序
  • 【VUE】RuoYi-Vue3项目结构的分析
  • 在QWidget中如何添加QAction