阿里云 OSS - 开通到使用、服务端签名直传(前后端代码 + 效果演示)

目录

开始

OSS 相关术语须知

阿里云 OSS 开通

阿里云 OSS 使用

官方文档教程

实战开发

阿里云 OSS 自动配置

环境配置

实战开发

服务端签名直传

概述

代码实现


开始


OSS 相关术语须知

中文

英文

说明

存储空间

Bucket

存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。(一般来讲,一个项目一个 Bucket)

对象/文件

Object

对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元数据(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。

地域

Region

地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等综合选择数据存储的地域。详情请查看OSS已经开通的Region。

访问域名

Endpoint

Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。具体的内容请参见各个Region对应的Endpoint。

访问密钥

AccessKey

AccessKey,简称AK,指的是访问身份验证中用到的AccessKeyId和AccessKeySecret。OSS通过使用AccessKeyId和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户,AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,其中AccessKeySecret 必须保密。

阿里云 OSS 开通

a)进入 阿里云官网,在搜索框中输入 OSS ,点击 “对象存储 OSS”

b)点击立即开通

c)点击管理控制台

d)创建一个 Bucket

阿里云 OSS 使用

官方文档教程

a)先创建 AccessKey(之后通过 OSS 上传文件都需要用到这里的 AccessKeyId 和 AccessKeySecret)

Ps: 子用户创建好之后,就可以拿到 AccessKeyId 和 AccessKeySecret,但是这个东西只能查看一次,所以一定要自己保管好!

接着还需要给这个子用户开通 Bucket 访问权限,如下:

b)API 文档教程

实战开发

a)引入依赖

        <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency>

 如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖。添加JAXB相关依赖示例代码如下:

        <dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency>

b)代码如下:

@SpringBootTest(classes = [ProductApplication::class])
class OSSTest {@Testfun test() {//endpoint 地域节点(bucket 的 概览中可以找到)val endpoint = "oss-cn-cnmdb.aliyuncs.com"val accessKeyId = "JLUOIUsuoUSobPUnoPJSF%&YTFSkl{op6mJvC"val accessKeySecret = "uJOIU989hUNIsadfjhoUIOGE1y42BJIOPHsfN"//创建 OSSClient 实例val ossClient = OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret)//上传文件流val inputStream = FileInputStream("D:/tmp/滑稽.gif")ossClient.putObject("gulimall-byd", "滑稽.gif", inputStream)//关闭 OSSClientossClient.shutdown()println("上传完成")}}

运行之后,就可以看到 OSS 上传成功,通过 URL 就可以直接访问,如下:

阿里云 OSS 自动配置

环境配置

本来想使用 SpringCloudAlibaba OSS 的,但是发现这玩意在 2023 版本里根本没有...   就自己写自动配置吧~

a)配置文件如下:

alibaba:oss:access-key: JLUOIUsuoUSobPUnoPJSF%&YTFSkl{op6mJvCsecret-key: uJOIU989hUNIsadfjhoUIOGE1y42BJIOPHsfNendpoint: oss-cn-cnmdb.aliyuncs.com

b)自动配置如下:

import com.aliyun.oss.OSS
import com.aliyun.oss.OSSClientBuilder
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration@Configuration
class OSSConfig {@Value("\${alibaba.oss.access-key}")private lateinit var accessKey: String@Value("\${alibaba.oss.secret-key}")private lateinit var secretKey: String@Value("\${alibaba.oss.endpoint}")private lateinit var endpoint: String@Beanfun ossClient(): OSS = OSSClientBuilder().build(endpoint, accessKey, secretKey) //注意参数顺序}

实战开发

import com.aliyun.oss.OSS
import jakarta.annotation.Resource
import org.cyk.gulimall.product.ProductApplication
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import java.io.FileInputStream
@SpringBootTest(classes = [ProductApplication::class])
class OSSTest {@Resourceprivate lateinit var ossClient: OSS@Testfun test() {//上传文件流val inputStream = FileInputStream("D:/tmp/滑稽.gif")ossClient.putObject("gulimall-cyk", "滑稽.gif", inputStream)println("上传完成")}}

服务端签名直传

概述

传统的,我们有两种方式将图片上传到 OSS:

a)前端请求 -> 后端服务器 -> OSS 

好处:在服务端上传,更加安全.

坏处:给服务器带来压力.

b)直接写在前端 js 代码中

好处:效率高,不用给服务器带来额外压力.

坏处:危险,用户直接可以看得到密钥信息.

因此最好的方式就是 服务端签名直传:用户直接去服务器请求获取上传签名(账号密码生成的防伪签名,一般有过期时间),校验安全,服务器就返回该用户的防伪签名,然后用户就可以拿着签名和要上传的文件,通过表单直接上传到 OSS 中.

代码实现

a)后端如下:

@RestController
@RequestMapping("/third/oss")
class OSSApi(private val ossClient: OSS
) {@Value("\${alibaba.oss.bucket}")private lateinit var bucket: String@Value("\${alibaba.oss.endpoint}")private lateinit var endpoint: String@Value("\${alibaba.oss.access-key}")private lateinit var accessKey: String@RequestMapping("/policy")fun policy(): Map<String, String> {val host = "https://$bucket.$endpoint"//这里可以配置上传文件到 以时间为前缀的文件夹 中val format = SimpleDateFormat("yyyy-MM-dd").format(Date())val dir = "$format/" //用户上传文件时指定前缀try {val expireTime = 30val expireEndTime = System.currentTimeMillis() + expireTime * 1000val expiration = Date(expireEndTime)// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。val policyConds = PolicyConditions();policyConds.run {addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);}val postPolicy = ossClient.generatePostPolicy(expiration, policyConds);val binaryData = postPolicy.toByteArray(Charset.forName("utf-8"))val accessId = accessKeyval encodedPolicy = BinaryUtil.toBase64String(binaryData);val postSignature = ossClient.calculatePostSignature(postPolicy);val respMap = LinkedHashMap<String, String>()respMap.run {put("accessid", accessId);put("policy", encodedPolicy);put("signature", postSignature);put("dir", dir);put("host", host);put("expire", (expireEndTime / 1000).toString());}return respMap} catch (e: Exception) {e.printStackTrace()}return mapOf("msg" to "fail")}}

b)前端如下:

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8" /><title>OSS web直传</title><metaname="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
</head>
<body>
<h2>OSS web直传---在服务端用Node.js签名</h2>
<ol><li>Bucket必须设置跨域,且允许Methods必须选中POST,否则无法执行表单上传。</li>
</ol>
<br />
<div><input type="file" id="fileInput" name="fileInput" /><input type="button" value="开始上传" onclick="upload()" />
</div>
<script>function upload() {const tokenUrl = "http://127.0.0.1:10010/third/oss/policy";fetch(tokenUrl).then(async (res) => {const { policy, signature, accessid, host, dir, stsToken } =await res.json();let formData = new FormData();formData.append("success_action_status", "200"); // 指定成功上传时,服务端返回状态码200,默认返回204。formData.append("policy", policy);formData.append("signature", signature);formData.append("OSSAccessKeyId", accessid);if (stsToken) formData.append("x-oss-security-token", stsToken);const files = document.getElementById("fileInput").files;if (files.length === 0) {alert("请选择文件");return;}formData.append("key", dir + files[0].name); // 文件名formData.append("file", files[0]); // file必须为最后一个表单域const param = {method: "POST",body: formData,};fetch(host, param).then((data) => {console.log(data);alert("上传成功");}).catch((error) => {console.error("Error:", error);});});}
</script>
</body>
</html>

Ps:上述代码中的跨域问题,前面的步骤处理过~   忘了,可以再往前看看

c)效果演示

返回阿里云,就可以看到如下:

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

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

相关文章

DB-GPT-PaperReading

DB-GPT: Empowering Database Interactions with Private Large Language Models 1. 基本介绍 DB-GPT 旨在理解自然语言查询,提供上下文感知响应,并生成高精度的复杂 SQL 查询,使其成为从新手到专家的用户不可或缺的工具。DB-GPT 的核心创新在于其私有 LLM 技术,该技术在…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一&#xff0c;FL Studio 2024发布引入了新功能&#xff0c;同时采用了新的命名方式&#xff0c;从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

ThinkPHP定时任务是怎样实现的?

接到一个需求&#xff1a;定时检查设备信息&#xff0c;2分钟没有心跳的机器&#xff0c;推送消息给相关人员&#xff0c;用thinkphp5框架&#xff0c;利用框架自带的任务功能与crontab配合来完成定时任务。 第一步&#xff1a;分析需求 先写获取设备信息&#xff0c;2分钟之…

力扣双指针算法题目:快乐数

目录 1.题目 2.思路解析 3.代码展示 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 题目意思是将一个正整数上面的每一位拿出来&#xff0c;然后分别求平方&#xff0c;最后将这些数字的平方求和得到一个数字&#xff0c;如此循环&#xff0c;如果在此循环中…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3],…

前端面试题8

基础知识 解释一下什么是跨域问题&#xff0c;以及如何解决&#xff1f; 跨域问题是由于浏览器的同源策略限制了从一个源加载的网页脚本访问另一个源的数据。解决方法包括使用JSONP、CORS&#xff08;跨源资源共享&#xff09;、设置代理服务器等。 描述一下事件冒泡和事件捕获…

Flutter-实现悬浮分组列表

在本篇博客中&#xff0c;我们将介绍如何使用 Flutter 实现一个带有分组列表的应用程序。我们将通过 CustomScrollView 和 Sliver 组件来实现该功能。 需求 我们需要实现一个分组列表&#xff0c;分组包含固定的标题和若干个列表项。具体分组如下&#xff1a; 水果动物职业菜…

BigDecimal(double)和BigDecimal(String)有什么区别?BigDecimal如何精确计数?

BigDecimal(double)和BigDecimal(String)的区别 double是不精确的&#xff0c;所以使用一个不精确的数字来创建BigDecimal&#xff0c;得到的数字也是不精确的。如0.1这个数字&#xff0c;double只能表示他的近似值。所以&#xff0c;当我们使用new BigDecimal(0.1)创建一个Bi…

golang验证Etherscan上的智能合约

文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口&#xff08;最重要的步骤&#xff09; golan…

归并排序的实现(递归与非递归)

概念 基本思想&#xff1a;归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使…

揭秘Conda:Python开发者必备的包管理神器

conda 简介 Conda 是一个开源的包管理系统和环境管理系统&#xff0c;用于安装和管理软件包以及创建和维护不同的软件环境。 它最初是为 Python 语言设计的&#xff0c;但现在已经支持多种编程语言&#xff0c;包括 R、Ruby、Lua、Scala 等。 1、Anaconda&#xff1a;是一个…

GPIO配置-PIN_Speed的理解

在使用STM32的GPIO 口配置时&#xff0c;经常会疑惑应该选用什么样的配置模式&#xff0c;本文谈谈对pin_speed的理解。 根据数据手册可得&#xff0c;STM32提供10MHz,2MHz和50MHz三种输出速度的配置&#xff0c;三种配置的应用场景是怎么样的&#xff1f;。 1.为什么要配置引…

[护网训练]原创应急响应靶机整理集合

前言 目前已经出了很多应急响应靶机了&#xff0c;有意愿的时间&#xff0c;或者正在准备国护的师傅&#xff0c;可以尝试着做一做已知的应急响应靶机。 关于后期&#xff1a; 后期的应急响应会偏向拓扑化&#xff0c;不再是单单一台机器&#xff0c;也会慢慢完善整体制度。…

论文辅助笔记:ST-LLM

1 时间嵌入 2 PFA&#xff08;Partial Frozen Architecture&#xff09; 3 ST_LLM 3.1 初始化 3.2 forward

强化学习中的Double DQN、Dueling DQN和PER DQN算法详解及实战

1. 深度Q网络&#xff08;DQN&#xff09;回顾 DQN通过神经网络近似状态-动作值函数&#xff08;Q函数&#xff09;&#xff0c;在训练过程中使用经验回放&#xff08;Experience Replay&#xff09;和固定目标网络&#xff08;Fixed Target Network&#xff09;来稳定训练过程…

科大讯飞-群聊对话角色要素提取:不微调范式模拟官网评分

不微调范式模拟官网评分 step1: 模型api配置及加载测试step2: 数据加载与数据分析&#xff1a;测试集分析:step3: prompt设计:step4 :大模型推理&#xff1a;step 5: 结果评分测试&#xff1a;评分细则&#xff1a;评估指标 参考&#xff1a; 比赛说明&#xff1a; #AI夏令营 #…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

Java项目:基于SSM框架实现的智慧城市实验室管理系统分前后台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的智慧城市实验室管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

Http Json参数到x-www-form-urlencoded参数的在线转换工具

Json参数到x-www-form-urlencoded参数的在线转换工具

算法:[动态规划] 斐波那契数列模型

目录 题目一&#xff1a;第 N 个泰波那契数 题目二&#xff1a;三步问题 题目三&#xff1a;最小花费爬楼梯 题目四&#xff1a;解码方法 题目一&#xff1a;第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 …