使用前端JS上传文件到阿里云的OSS服务器,PHP生成STS临时访问凭证

news2024/11/23 13:39:59

官方教程地址:https://help.aliyun.com/document_detail/383950.html?spm=a2c4g.383952.0.0
这篇文章主要是指出官方教程没有说明的地方

后端代码

并非是完全完全不需要后端的参与。需要后端生成凭证,防止秘钥泄露

这里是官方的说明文档:使用STS临时访问凭证访问OSS

按照官方说法来到第五步
第五步只提供了Java代码,并且PHP的SDK中说明,缺少了一个步骤
PHP的SDK中说明需要引入如下SDK

composer require alibabacloud/sts-20150401

这里还缺少一个SDK的引入,如下

composer require "alibabacloud/client"

使用Thinkphp的实现代码如下:


namespace app\api\controller;

use OSS\Core\OssException;
use OSS\OssClient;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use think\Config;
use think\Controller;
use think\Debug;
use think\Request;
use think\Session;

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

class Upload extends Controller
{
 	/**
     * 阿里云Sts凭证
     */
    public function getStsToken()
    {
        $accessKeyId = "你自己在阿里云设置的RAM的accessKeyId"; // 你自己的
        $accessKeySecret = "你自己在阿里云设置的RAM的accessKeySecret"; // 你自己的
        $roleArn = "你自己在阿里云设置的RAM的roleArn";  // 角色访问控制 RoleArn,你在设置的
        $roleSessionName = "ramosstest"; // 临时凭证名称,随意

        AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
            ->regionId('cn-hongkong')
            ->asDefaultClient();

        try {
            $result = AlibabaCloud::rpc()
                ->product('Sts')
                ->scheme('https') // https | http
                ->version('2015-04-01')
                ->action('AssumeRole')
                ->method('POST')
                ->host('sts.aliyuncs.com')
                ->options([
                    'query' => [
                        'RegionId' => "cn-hongkong",
                        'RoleArn' => $roleArn,
                        'RoleSessionName' => $roleSessionName,
                    ],
                ])
                ->request();

            echo "<pre>";
            return print_r($result->toArray());
        } catch (ClientException $e) {
            return json($e->getErrorMessage());
        } catch (ServerException $e) {
            return json($e->getErrorMessage());
        }
    }
}

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>

<body>
<button id="upload">上传</button>
<input id="file" type="file" />
<!--导入SDK文件-->
<script
        type="text/javascript"
        src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"
></script>
<script type="text/javascript">
    const client = new OSS({
        region: 'oss-cn-hongkong',
        accessKeyId: 'STS.后端代码调用生成的accessKeyId',
        accessKeySecret: '后端代码调用生成的accessKeySecret',
        stsToken: '后端代码调用生成的SecurityToken',
        bucket: 'kdlbook-hongkong'
    });

    let data;
    const upload = document.getElementById("upload");

    async function putObject (data, originalFilename, originalFileExtension) {
        try {
        	// 我这里做了一些小的变更,采用的原始文件名+随机字符串来防止文件重复,当然也可以采用日期的格式
            let newFilename = `${originalFilename}_${Math.random()}${originalFileExtension}`;
            const result = await client.put(
                `${newFilename}`,
                data
            );
            alert("上传结果完成,返回文件名为:"+result.name);
            console.log(result);
        } catch (e) {
            console.log(e);
        }
    }

    upload.addEventListener("click", () => {
        data = document.getElementById("file").files[0];
        let originalFilename = data.name.substring(0, data.name.lastIndexOf('.'));
        let originalFileExtension = data.name.substring(data.name.lastIndexOf('.'));
        putObject(data, originalFilename, originalFileExtension);
    });
</script>
</body>
</html>

需要注意的问题

  1. 官方文档里面有一个上传回调,但是这里并不需要,是同步回调的,虽然F12里面没有看到接口的返回值
  2. 由于是JS请求,存在跨域问题,需要设置跨域请求。官方文档:https://help.aliyun.com/document_detail/31870.html?spm=a2c4g.375302.0.i3
    在这里插入图片描述
  3. You have no right to access this object because of bucket acl.
    这个需要开启访问权限,可以F12查看返回内容类似如下
<Error> <Code>AccessDenied</Code> 
<Message>You have no right to access this object because of bucket acl.</Message> 
<RequestId>622FF5149849B43239F0C519</RequestId> <HostId>bucketbylz.oss-cn-beijing.aliyuncs.com</HostId> 
</Error>

这种情况是文件已经上传成功了,只是访问权限有限制。
文档地址:https://help.aliyun.com/document_detail/100676.html?spm=a2c4g.450754.0.i2#concept-blw-yqm-2gb
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

obj文件解析及用meshlab查看

举例 它以txt打开后如下所示 v -0.3 0 0.3 v 0.4 0 0 v -0.2 0.3 -0.1 v 0 0.4 0 # 4 verticesg head s 1 f 1/1/1 2/1/1 4/1/1 f 1/1/1 2/1/1 3/1/1 f 2/1/1 4/1/1 3/1/1 f 1/1/1 4/1/1 3/1/1一般而言obj文件以txt格式打开后包含如下片段 v -0.3 0 0.3 vt 0.625 0.458 0.00…

FPGA纯verilog实现UDP协议栈,GMII接口驱动88E1111,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、该UDP协议栈性能4、详细设计方案网络PHYGMII AXIS接口模块AXIS FIFOUDP协议栈 5、vivado工程1-->B50610 工程6、上板调试验证并演示准备工作查看ARPUDP数据回环测试 7、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现ud…

密码学学习笔记(七):Modular arithmetic - 模算数

简介 模算术是整数的一种算术结构&#xff0c;其中数字在达到特定值时“环绕”。模运算使我们能够简单地生成群、环和域&#xff0c;这是大多数现代公钥密码系统的基本构造部分。其中数字超过一定值后&#xff08;称为模&#xff09;后会“卷回”到较小的数值。 模算数常见的…

5.2ORB-SLAM3之回环矫正

1.简介 在上一章《回环检测之检测是否存共视区域》已经介绍了检测共视区域的部分&#xff0c;接下来就是对共视区域进行回环矫正或者地图融合。 回环矫正和之前的ORBSLAM系列一致&#xff0c;就是消除因为长时间运动产生的位姿累计误差和尺度漂移。在ORBSLAM3中新增了多地图系…

idea集成maven-mvnd

maven-mvnd是什么&#xff1f; 参考文档&#xff1a; Maven加强版 — mvnd的使用测试 - 知乎 1.下载mvnd安装包 Releases apache/maven-mvnd GitHub 2.修改配置文件&#xff1a;安装包中的conf目录下的mvnd.properties文件 配置maven settings的地址&#xff1a; 注意&am…

MySQL配置主从备份

文章目录 1.什么是主从备份2. 原理3.配置主服务器4.配置从服务器4.1进入数据库&#xff0c;准备建立连接4.2开启 slave 连接&#xff0c;主备机连接成功&#xff0c;数据开始同步4.3查看有关从属服务器线程的关键参数的信息 1.什么是主从备份 主从复制简单来说就是主库把增删改…

环境搭载vscode

Windows 10 下 VS Code 配置 C 开发环境&#xff08;MinGW&#xff09; 读书读傻了哟 配置 C/C 环境   主要是配置launch.json、tasks.json这两个文件&#xff08;当然&#xff0c;还有别的.json文件&#xff0c;可有可无&#xff09;。这两个文件位于.vscode文件夹下&#…

mysql--第一天基础操作

1.创建数据库 2.查询创建数据的语句 3.使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 4.删除数据库 5.在一张表中定义多个字段&#xff0c;要使用今天提到的所有的数据类型&#xff08;数字&#xff0c;文本&#xff0c;日期&#xff09; 查看表结构

产品方案设计高效的4大注意事项

做产品方案时&#xff0c;我们容易遭遇&#xff1a;未澄清需求、未梳理业务方案、缺少思考过程以及缺少对比方案等误区&#xff0c;往往会造成产品方案并不能完全解决用户问题&#xff0c;项目后期容易遇到需求变更等风险。 因此如何如何高效设计产品方案&#xff1f;就显得尤为…

SpringCloud入门实战(十二)-Sleuth+Zipkin分布式请求链路跟踪详解

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

Django的数据库配置、生成(创建)过程、写入数据、查看数据的学习过程记录

目录 01-配置数据库信息02-安装Python的MySQL数据库驱动程序 mysqlclient03-安装Mysql&#xff0c;并启动Mysql04-定义Django的数据库模型(定义数据表-编写models.py文件)05-按照数据的配置生成数据库(执行迁移命令)05-01-生成迁移执行文件05-02-执行数据库模型迁移 06-查看数据…

Vue.js Js引入相关

Vue.js vue.js 新增了一些语法,有一些旧的模组并没有使用"先进"的export和import语法 即 es语法进行模块化。 <script></script>但 editor.md 真的很好用. 但很抱歉,它在vue中无法使用 es6 进行导入。 所以需要使用传统的方式进行导入。 很多人会把js…

【ARM Coresight 系列文章 2.1 - ARM Coresight 组件介绍】

文章目录 1.1 Coresight 组件介绍1.1.1 Trace sources1.1.2 Trace Sinks1.1.2 Trace links 1.1 Coresight 组件介绍 图 1-1 1.1.1 Trace sources 什么是 Trace source? 在ARM Coresight技术中&#xff0c;Trace Source是指处理器中的一个组件&#xff0c;用于产生和发送跟踪数…

全球十大看黄金走势免费app软件最新名单推荐(综合版)

选择黄金走势免费app软件时&#xff0c;有几个关键因素需要考虑。首先&#xff0c;要选择可靠的软件平台&#xff0c;确保其在金融市场上拥有良好的声誉和高度的信任度。此外&#xff0c;软件应提供及时准确的市场数据&#xff0c;包括实时行情、交易量和技术指标等&#xff0c…

高速PCB布局布线规范

目录 一、容抗/感抗 1.容抗 2.感抗 二、寄生电容/分布电容/杂散电容 1.寄生电容 2.分布电容 3.杂散电容 4.寄生电容/分布电容/杂散电容对信号的影响 5.怎么减小分布电容&#xff1f; 三.寄生电感 1.什么是寄生电感&#xff1f; 2.怎么减小寄生电感&#xff1f; 四.…

ROS:节点名称重名

目录 一、前言二、rosrun设置命名空间与重映射2.1设置命名空间2.2rosrun名称重映射2.3rosrun命名空间与名称重映射叠加 三、launch文件设置命名空间与重映射四、编码设置命名空间与重映射4.1C 实现:重映射4.2C 实现:命名空间4.3Python 实现:重映射 一、前言 ROS 中创建的节点是…

Python3在Windows上设置环境变量方法

Python3在Windows上设置环境变量方法&#xff0c;在环境变量中添加Python目录&#xff1a; 在命令提示框中(cmd) : 输入 path%path%;C:\Python 按下"Enter"。 注意: C:\Python 是Python的安装目录。 也可以通过以下方式设置&#xff1a; 右键点击"计算机&q…

《深入理解计算机系统》(9)内存管理

1、物理和虚拟寻址 物理寻址 主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。CPU 访问内存最自然的方式就是使用物理地址&#xff0c;称为物理寻址。下图是一个物理寻址的示例&#xff0c;该示例的上下文是一个加载指令&#xff0c;它…

群载波应急广播主机的应用

一、 概述 群载波主机是专为山洪灾害预警、气象预警、地质灾害预警设计的一款智能IP群载波主机。该群载波主机可通过网络实现与控制中心通讯&#xff0c;用户可实时远程控制功放的开关机状态以及检测设备的主要信息。群载波主机主要用于接收网络信号&#xff0c;与控制中心通讯…

如何在Ubuntu系统中添加硬盘

这里写自定义目录标题 一. 安装磁盘二. 查看和新建硬盘分区2.1 查看硬盘分区2.2 创建硬盘分区 三. 分区格式化四. 分区挂载到目录五. 配置启动挂载 众所周知&#xff0c;在Linux系统中有一个著名的说法&#xff0c;即”一切皆文件“。包括磁盘在内的各种连接到系统的设备都用文…