阿里云对象存储OSS的前端直传-demo

news2024/9/21 18:55:50

原由 

在项目里有时候会碰到比如上传文件相关的,一般都是后端提供个接口,然后我们上传的时候后端再传到阿里OSS或者其他服务商的对象存储,然后把最终的url拿到存起来或者返回给前端,这种方式其实在上传图片的频率不高的业务场景中可能并无大碍,但是如果你的项目是相册类的,资源提供类的,总之就是有很频繁的上传文件的场景,可能服务器的带宽就有点扛不住了,那么有没有更好的解决方案呢?服务端签名,客户端直传其实像阿里、腾讯、七牛等云服务厂商都提供的有类似阿里的STS(Security Token Service)临时访问权限管理服务,这次就以阿里云为例,给大家介绍下如何使用STS Token,来实现在服务端签名出STS token,然后提供给前端,让前端直接用这个Token向阿里云直传文件服务端签名,获取到STS token我们这里直接以Node.js为例,其他语言的服务可以在阿里云的SDK参考(STS)文档里面找到,有Python、Java...首先我们需要先装一个sts-sdk的npm包:@alicloud/sts-sdk(Nodejs version >= 8.5.0)

后端

npm install @alicloud/sts-sdk

然后我们在utils新建一个文件oss-sts-server.js,用来生成STS Token提供给前端使用(这里只作为实例,后续大家可以自行封装)

const StsClient = require('@alicloud/sts-sdk');

/**
 * 生成STStoken
 * @param accessKeyId AccessKey ID
 * @param accessKeySecret 从STS服务获取的临时访问密钥AccessKey Secret
 * @param roleArn 指定角色的ARN
 * @param roleSessionName 时临时Token的会话名称,自己指定用于标识你的用户,或者用于区分Token颁发给谁
 * @param durationSeconds token 有效事件,单位:秒
 * @param policy 指定的授权策略 默认为null
 * @return
 *   RequestId, 请求id
 *   AssumedRoleUser: {
 *     Arn, ${roleArn}/${roleSessionName}
 *     AssumedRoleId
 *   },
 *   Credentials: {
 *     SecurityToken, sts token
 *     AccessKeyId, accessKeyId
 *     AccessKeySecret, accessKeySecret
 *     Expiration 过期时间
 *   }
 */
export default function generateSTSToken(accessKeyId, accessKeySecret, roleArn, roleSessionName = 'external-username', durationSeconds = 3600, policy = null) {
  const sts = new StsClient({
    endpoint: 'sts.aliyuncs.com', // check this from sts console
    accessKeyId, // check this from aliyun console
    accessKeySecret // check this from aliyun console
  });
  return res = await sts.assumeRole(roleArn, roleSessionName, policy, durationSeconds);

这个generateSTSToken函数的几个入参我来解释一下,通常我们在用阿里云或者腾讯云的时候通常会开一个RAM账户也是就子账户,我们用子账户登录到阿里云后台后,到对象存储(OSS)控制台页面,找到安全令牌(子账号授权),也就是下图中标记的地方,点击上面的前往RAM控制台按钮


随后点击开始授权按钮,之后你就可以得到accessKeyId、accessKeySecret、roleArn、roleSessionName还有默认的过期时间DurationsSeconds,如下图所示,由于我之前授权过一次,所以会有左下角这个提示,这几个参数一定到保存好,不要泄露,一旦泄露,请更改RAM账户密码,并重新生成,使之前的失效

完善服务端提供的数据
这个时候其实已经拿到accessKeyId、accessKeySecret、stsToken、expiration这四个参数了

但是客户端还需要bucket:对象存储的命名空间和region:bucket所在地域这两个参数

这个bucket其实就是对应的使用的那个bucket,这个可以在阿里云对象存储页面看到,有一个bucket列表,就是你要是用的那个bucket的名字region就是某一个bucket所在的地域,比如我这个就是oss-cn-beijing

此时服务端的工作已经完结了,可以提供前端一个接口,通过鉴权之后,返回给前端这么几个参数,接下来,让我们把舞台交给我们的前端~

{
  accessKeyId,
  accessKeySecret,
  stsToken,
  bucket,
  region,
  expiration
}

前端

前端er们来跟我 左边一起画个龙 在你右边 画一道彩虹(bushi)首先我们也新建一个oss-sts-client.js/ts,然后安装一个ali-sdk/ali-oss的包,对了不支持IE10和之前的IE版本啊

npm install ali-oss --save

然后复制下面的内容到这个文件中,用js的同学可以把ts相关的代码删掉

// 这个是服务端提供给前端的一个请求接口,返回上面我们提到的几个参数
import { getOssSTSToken } from "./request"; 
// @ts-ignore 忽略ts报错,ali-oss赶紧提供@types包吧,文档难看懂,库也没个文档,你们文档要是维护的好,我还用写这个?我都不想吐槽……(bushi)
import OSS from 'ali-oss'

type OssStsType = {
  accessKeyId: string
  accessKeySecret: string
  stsToken: string
  expiration: number // 这个是前端计算出的还有多少秒token过期
  region: string
  bucket: string
}

/**
 * 获取OSSClient
 * @param accessKeyId AccessKey ID
 * @param accessKeySecret 从STS服务获取的临时访问密钥AccessKey Secret
 * @param stsToken 从STS服务获取的安全令牌(SecurityToken)
 * @param region Bucket所在地域
 * @param bucket Bucket名称
 */
export default async function getOssClient () {
  const { code, data: params } = await getOssSTSToken();
  if (code !== 200) return false; // 如果请求出错,在上游处理
  const client = new OSS({
    ...params,
    refreshSTSTokenInterval: params.expiration,
    // 刷新临时访问凭证的时间间隔,单位为毫秒。
    //(这个refreshSTSToken是文档里的,为了保险各位可以在每次上传前先检查一次过期没有,不要依赖提供的这个方法)
    refreshSTSToken: async () => {
      const { code, data } = await getOssSTSToken(); // 过期后刷新token
      if (code === 200) {
        return data
      }
    },
  })
  return client
}

好了,到现在为止我们已经封装好了这个前端需要在上传文件的时候调用的方法了

前端维护STS Token
首先我们在前端页面第一次上传文件的时候,要调用这个getOssClient方法获取到oss-client这个对象实例,才能用这个实例进行上传操作,之后上传的时候需要先判断一下token过期了没有,如果没有过期,还是用这个实例进行上传操作,如果过期了,重新生成一个实例!这里我们就拿一个简单的上传小文件为例(大文件分片上传,和上传成功回调(需要后端同学提供回调地址) 可以自己去看文档,我就不展开细说了)

async function uploadFileAction(file, client) {
  let newClient = client;
  // 伪代码:
  // if (!newClient || token is expired) { // 如果是没有实例对象或者token过期了就要重新生成
  //  newClient = await getOssClient(); // 调用上面我们封装好的一个方法
  // }
  const filePath = 'xxx/xxx/' // 最中在bucket中的存放的路径根据业务需要自行设置,文件名也是可以自行设置
  const { res, name, url } = await newClient.put(`${filePath}${file.name}`, file);
  if (res.status === 200) {
    // 这里拿到上传成功的文件的url
    return url
  }  
}

关于这里oss-client的维护策略,各位就仁者见仁智者见智吧,方案很多,怎么贴合业务怎么来,但是不推荐往localStorage和sessionStorage和indexDB里面存STS token等那些参数,你怎么就确定你的用户不是一名前端er呢?

CORS的问题
还没完啊,xdm 稍等一下,以上的都完了之后,我们在本地联调的时候如果没有开代理还是会有CORS的问题,这时候还是要去服务端去配置,找到跨域设置,进去创建一个规则,方法看你用什么就勾上什么,来源和允许Headers 直接给干成*就完事了

案例-分片上传

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

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

相关文章

电商数据接口助力电商数据分析||电商运营每日必看5个底层数据

数据分析充电站——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 电商运营店铺涉及大量数据,包括用户行为、交易记录、库存信息等,如何…

Python测试之测试覆盖率统计

本篇承接上一篇 Python测试框架之—— pytest介绍与示例,在此基础上介绍如何基于pytest进行测试的覆盖率统计。 要在使用 pytest 进行测试时检测代码覆盖率,可以使用 pytest-cov 插件。这个插件是基于 coverage.py,它能帮助你了解哪些代码部…

【PySide6-QML】2. 添加菜单栏

文章目录 前言实现添加菜单栏添加菜单添加子菜单点击动作添加快捷键 前章回顾:【PySide6-QML】1. 创建新项目 前言 本文使用 MenuBar 添加工具菜单栏,Action 添加子菜单,并添加快捷键和动作回调。 实现 添加菜单栏 import QtQuick.Contr…

centos mongodb安装+开机启动

1.mongodb安装 Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 步骤1-下载 下载地址:Download MongoDB Community Server | MongoDB 步骤2-安装-修改配置 Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 下载包到 /usr/local/ 解压 tar…

新一代RK3576芯片,3588平替吗?

瑞芯微RK3576是一款高性能、低功耗的SoC(系统级芯片)处理器,适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU,集成了GPU、MCU、NPU、VPU等多种计算核心,并具有丰富的外…

基于深度学习的交通标志检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov5、yolov5 SE注意力机制,两个模型都已训练好,可直接使用。 数据集:     网上下载的数据集,格式都已转好,可…

K8S对接Ceph分部署存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…

【精选】基于数据可视化的智慧社区内网平台(程序员阿龙出品精品)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

游戏出海,燃动全球,“安全”如何通关?

泼天的富贵落在了游戏圈,用事实打脸了男人消费不如狗的谬论。 这几天,无论是游戏圈内人还是圈外人,无人不知晓《黑神话:悟空》。这部头顶「3A国产游戏之光」的作品自6月8日预售以来,全平台销量超过800万份,…

基于R语言的统计分析基础:数据结构

R语言是一种用于统计分析和图形表示的编程语言和软件环境,它提供了多种数据结构以存储和操作数据。这些数据结构包括向量、矩阵、数组、数据框、列表、因子、Tibble、环境、公式、调用以及表达式。 向量(Vector) 向量是R中最基本的数据结构…

InstantID: Zero-shot Identity-Preserving Generation in Seconds

https://arxiv.org/pdf/2401.07519#page9.73https://github.com/instantX-research/InstantID?tabreadme-ov-filehttps://github.com/instantX-research/InstantID/pull/89/files 问题引入 目标是生成和reference图片相符合的图片,特别是人脸;现在基于…

C++必修:unordered_set/unordered_map

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. unordered_set的介绍 unordered_set是一种关联式容器,它具有以下几…

使用MVC设计模式根据软件系统设计建设高校数字化教育教学资源共享平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(6 分) 【问题 3】(10 分) 答案 【问题 1】答案 【问题 2】答案 【问题 3】解析 相关推荐 案例 阅读以下关于软件系统设计的叙述,在答题纸上回答问题 1 至问题 3。 【题目】 某软件企业受该省教育部门委托…

【SpringCloud Alibaba】(九)学习 Gateway 服务网关

目录 1、网关概述1.1、没有网关的弊端1.2、引入 API 网关 2、主流的 API 网关2.1、NginxLua2.2、Kong 网关2.3、Zuul 网关2.4、Apache Shenyu 网关2.5、SpringCloud Gateway 网关 3、SpringCloud Gateway 网关3.1、Gateway 概述3.2、Gateway 核心架构 4、项目整合 SpringCloud …

【妙招大放送】:苹果手机数据恢复的4个技巧来啦!

手机是我们日常生活中不可或缺的一部分,它存储着照片、视频、联系人等许多重要的数据。但是,意外时有发生,我们有时会因为软件崩溃或者是手机损坏等的原因导致这些重要的数据丢失。那么,对于苹果用户来说,苹果手机数据…

电源技术中的深力科强力推荐一款低功耗、高效率同步降压变换器SiLM6609 致力于为您提供高品质电源技术解决方案

在能源紧张且智能化技术高速发展的当下,电源是电子设备不可或缺的核心。电源的质量和效率直接关系到设备的稳定运行和能耗控制,对于提高设备性能和降低运营成本至关重要。 为应对现代电子设备对性能与能耗的严苛要求,SiLM6609——低功耗、高…

.NET 一款通过白名单程序执行命令的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

Adobe Photoshop PS v25.6 下载安装教程(PS下载)

前言 Adobe Photoshop 是一款专业强大的图片处理工具,从照片编辑和合成到数字绘画、动画和图形设计,一流的图像处理和图形设计应用程序是几乎每个创意项目的核心所在。利用 Photoshop 在桌面上的强大功能,您可以在灵感来袭时随时随地进行创作…

vue2使用electron-builder打包-使用electron的api实现文件下载

本项目用的是vue2版本开发,最后使用electron-builder打包成桌面应用程序 一、需求描述 1、用户点击按钮,下载html文件 2、代码 exportHtml() { //.html是放在public文件夹下面的本地文件axios.get("/html/合同模板.html").then(res > {let…

网络通信和TCP/IP协议详解

目录 网络协议 一、计算机网络是什么? 定义和分类 计算机网络发展简史 二、计算机网络体系结构 OSI 七层模型 TCP/IP 模型 TCP/IP 协议族 IP、TCP 和UDP TCP/IP 网络传输中的数据 地址和端口号 MAC 地址 IP 地址 端口号 综述 三、TCP 特性 TCP 三次握…