基于Amazon S3的通用封装oss-spring-boot-starter,支持前端分片直传

news/2024/9/17 19:08:09/

前段时间使用minio-java封装了一个 minio-spring-boot-starter,但是有局限性,不能很好的支持各个云服务厂商的OSS服务,为此,利用 aws-java-sdk-s3 做一个统一的封装,兼容S3 协议的通用文件存储工具类 ,支持 兼容S3 协议的云存储

  • MINIO
  • 阿里云
  • 华为云
  • 腾讯云
  • 京东云
  • 七牛云

maven

目前最新版本:3.0.0

项目源码:GitHub、腾讯云Coding

适配 SpringBoot3.x,也支持 SpringBoot2.x

最新版本查询:https://central.sonatype.com/artifact/com.kangaroohy/oss-spring-boot-starter

<dependency><groupId>com.kangaroohy</groupId><artifactId>oss-spring-boot-starter</artifactId><version>${lastVersion}</version>
</dependency>

使用方法

配置文件

kangaroohy:oss:endpoint: https://demo.kangaroohy.comaccess-key: adminsecret-key: admin123

path-style-access: false 时,也就是 virtual-host-style

  • https://{bucketName}.{endpoint}
  • 如:https://{bucketName}.demo.kangaroohy.com

path-style-access: true 时

  • https://{endpoint}/{bucketName}
  • 如:https://demo.kangaroohy.com/{bucketName}

代码使用

注入OssTemplate,调用相关方法即可

    @Autowiredprivate OssTemplate ossTemplate;@PostMapping("/upload")@Operation(summary = "普通上传")public RestResult<String> upload(MultipartFile file) throws IOException {ossTemplate.putObject(bucketName, file.getOriginalFilename(), file.getContentType(), file.getInputStream());return RestResult.ok();}

封装方法不满足时,可自行注入 AmazonS3 ,调用原始方法

    @Autowiredprivate AmazonS3 amazonS3;

前端PUT直传

后端,获取上传的url,前端 PUT 方式直接请求

注:七牛云、腾讯云等云服务器厂商可能需要配置跨域

    @GetMapping("/upload-url")@Operation(summary = "获取Put直传地址")public RestResult<String> uploadUrl(@RequestParam String fileName) {String url = ossTemplate.getPresignedObjectPutUrl(fileName);return RestResult.ok(url);}

在这里插入图片描述

分片上传

推荐方式二

方式一 后端接收分片,再上传oss服务器

思路:请求后端获取分片标识,前端分片,请求后端接口上传分片,上传完成,再请求合并分片的接口

    @GetMapping("/upload-id")@Operation(summary = "获取分片upload id")public RestResult<String> uploadId(@RequestParam String fileName, @RequestParam String contentType) {InitiateMultipartUploadResult uploadResult = ossTemplate.initiateMultipartUpload(ossTemplate.getBucketName(), fileName, contentType);    return RestResult.ok(uploadResult.getUploadId());}@PutMapping("/upload-part")@Operation(summary = "分片上传")public RestResult<String> uploadPart(@RequestPart MultipartFile file, @RequestPart @Validated UploadPartInfoBO partInfo) {byte[] md5s;long partSize;ByteArrayInputStream inputStream;try {md5s = MessageDigest.getInstance("MD5").digest(file.getBytes());partSize = file.getSize();inputStream = new ByteArrayInputStream(file.getBytes());} catch (NoSuchAlgorithmException | IOException e) {throw new FailException("分块上传MD5加密出错");}ossTemplate.uploadPart(partInfo.getUploadId(), partInfo.getFileName(), Base64.encodeAsString(md5s), partInfo.getPartNumber(), partSize, inputStream);return RestResult.ok();}@GetMapping("/merge-part")@Operation(summary = "分片上传完成合并")public RestResult<String> mergePart(@RequestParam String fileName, @RequestParam String uploadId) {ossTemplate.completeMultipartUpload(fileName, uploadId);return RestResult.ok(ossTemplate.getGatewayUrl(fileName));}
@Data
public class UploadPartInfoBO {@NotNull(message = "uploadId is required")private String uploadId;@NotNull(message = "fileName is required")private String fileName;@NotNull(message = "partNumber is required")private Integer partNumber;
}

在这里插入图片描述

方式二 前端直传oss服务器

注:云服务商oss可能需要配置跨域

思路:前端请求后端,获取各个分片预签名 url,直接 PUT 方式请求上传 oss 服务器,上传完成,请求后端合并分片

    @GetMapping("/part-url")@Operation(summary = "获取分片直传地址")public RestResult<MultiPartUploadInfo> partUrl(@RequestParam String fileName, @RequestParam int partSize, @RequestParam String contentType) {MultiPartUploadInfo uploadInfo = ossTemplate.getPresignedMultipartUploadUrls(fileName, partSize, contentType);return RestResult.ok(uploadInfo);}@GetMapping("/merge-part")@Operation(summary = "分片上传完成合并")public RestResult<String> mergePart(@RequestParam String fileName, @RequestParam String uploadId) {ossTemplate.completeMultipartUpload(fileName, uploadId);return RestResult.ok(ossTemplate.getGatewayUrl(fileName));}

在这里插入图片描述


http://www.ppmy.cn/news/44900.html

相关文章

23北京邮电大学备考经验

目录【写在前面】本科成绩择校历程英语复习数学复习政治复习专业课复习其它建议笔记复盘压力处理恋爱关系【写在最后】【写在前面】 初试成绩&#xff1a; 本科成绩 总体&#xff1a;浙江某双非学校的软件工程专业、综合测评成绩班级前两名、浙江省省级优秀毕业生、发表过论…

每块硬盘最多可以有几个扩展分区?各个扩展分区最多可以有多少个逻辑驱动器?请高手告知,谢谢!

不同系统&#xff0c;不同分区方案&#xff0c;数量也有不同的。 Linux: 主分区最多4个 逻辑分区: SCSI 最多 16 个 IDE 最多 63 个 传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中&#xff0c;每个分区项占用16个字节&#xff0c…

C# 中的泛型

C# 中的泛型 泛型(Generic)是C# 2.0和通用语言运行时(CLR)的一个新特性&#xff0c;泛型为 .Net 框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时不必确定一个或多个参数&#xff0c;具体参数可以等到调用时候的代码声明和实现确定。这意味着使用泛型…

React | React的JSX语法

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ Node.js专栏&#xff1a;Node.js 初级知识 &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React Node专栏 &#…

多个渠道成功销售的秘诀速递

将您的电子商务业务扩展到多个渠道销售似乎是一项艰巨的任务吗&#xff1f;但如果有了正确的多渠道增长战略&#xff0c;这可能是实现快速增长的好方法。当然&#xff0c;您需要考虑借助一些工具与策略&#xff0c;而SaleSmartly&#xff08;ss客服&#xff09;可以为您提供。 …

minio 部署、迁移、使用

一、minio 部署 1、单节点部署 部署IP&#xff1a;192.168.206.10 1.1、下载minio的二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/minio 1.2、规划磁盘 minio 数据目录一定不能和 跟/ 在一个磁盘上&#xff0c;要单独挂载&#xff0c;比如规划将m…

Netty通信技术进阶二

Netty核心组件 1. Bootstrap2 Channel3. EventLoopGroup 和 EventLoop3.1 eventLoopThreads 是多少&#xff1f; 4. ChannelHandler & ChannelHandlerContext & ChannelPipeline4.1 复用Handler4.2 ChannelInboundHandlerAdapter or SimpleChannelInboundHandler 5. By…

7nm+跨域计算+极致性价比,这家芯片厂商助攻车企「降本增效」

汽车芯片赛道的「卷」&#xff0c;或许超出了所有人的预期。对于单纯TOPS算力的比拼&#xff0c;已经翻篇&#xff0c;如何让车企有的用&#xff0c;用得上&#xff0c;还要用得好&#xff0c;已经是新风向。 实际上&#xff0c;在汽车智能化刚刚开始的2018年&#xff0c;彼时类…

【开懂C++】引用与关键字auto

目录 一.引用1.引用的概念2.引用的使用和问题3.引用与指针的比较二.关键字auto 一.引用 1.引用的概念 引用就是给一个已经存在的变量取一个别名&#xff0c;与变量共用一段内存空间。注意引用的类型必须和变量类型相同&#xff0c;来演示下引用如何使用。 #include <iost…

xshell是什么软件

xshell是什么软件? Xshell 是一个强大的远程管理软件&#xff0c;它支持SSH&#xff0c;TELNET 协议。Xshell可以在Windows下访问远端服务器、路由器、网络机顶盒等&#xff0c;类似的常用软件还有putty&#xff0c;以及Windows下的Telnet。 下面简单介绍一下xshell软件。 X…

面试题React

1.React Fiber是什么&#xff1f; 在 React V16 将调度算法进行了重构&#xff0c; 将之前的 stack reconciler 重构成新版的 fiber reconciler&#xff0c;变成了具有链表和指针的 单链表树遍历算法。通过指针映射&#xff0c;每个单元都记录着遍历当下的上一步与下一步&…

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f; 不清楚如何有效应用金融数据治理及数据安…

LeetCode:376. 摆动序列——说什么贪心和动规~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;376. 摆动序列 题目描述&#xff1a;如果连续数字之间的差严格地在正数…

[golang gin框架] 23.Gin 商城项目-前台templates模板分离,首页,顶部导航,轮播图 左侧分类数据渲染

一.首页界面展示以及项目结构分析 首页界面展示 项目结构分析 二.代码展示 首页相关模型 首页相关模型如下: [golang gin框架] 21.Gin 商城项目-导航模块功能 [golang gin框架] 17.Gin 商城项目-商品分类模块, 商品类型模块,商品类型属性模块功能操作 [golang gin框架] 16.Gin …

科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新

尹奎 中建三局一公司技术中心主任 教授级高级工程师&#xff0c;BIM领域资深专家&#xff0c;完成10余个基于BIM的相关研究课题&#xff0c;获省部级以上科技进步奖 13 项&#xff1b;公开出版专著3部&#xff0c;参与编写“十二五”国家重点图书出版规划项目《BIM应用施工》&a…

实现一个登录功能方案设计2

需求MySQL表实现方案 index页面home页面 需求 实现一个登录功能 实现的功能 注册(邮箱注册) 登录(邮箱密码) 重置密码 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) 登出 在第一版的基础上进行优化:\ 优化点: 存操作信息 请求的post使用中间件进行储存操作信息.避免重复…

门面设计模式

目录 前言&#xff1a; 门面模式的原理与实现 门面模式的应用场景 1. 解决易用性问题 2. 解决性能问题 3.解决分布式事务问题 总结&#xff1a; 参考资料 前言&#xff1a; 相信我们平时的工作多多少少都涉及过接口设计&#xff0c;为了保证接口的可复用性&#xff0c;我…

【论文阅读】ViT阅读笔记

标题 一张图片可以等价于16*16的单词 transformer可以做大规模的图像识别 摘要 虽然现在transformer在nlp上得到广泛运用&#xff0c;但在cv上还没有运用 一般都是cnnattention 现在用transformer用cv的效果特别好 引言 nlp的主流方式&#xff1a;先做预训练&#xff0…

Linux -- 进阶 Web 服务器 基础前瞻 ( 一 )

目录 WWW 简介 &#xff1a; 组件一个网站得需要哪些东西呢 &#xff1f;&#xff1f; 1 得有 响应用户申请网页服务 的软件 2 服务器主机 3 那就需要数据了 4. 浏览器 预备知识 &#xff1a; 网址及HTTP 简介 &#xff1a; URL : http 请求方法 &#xff1a;…

SpringCloud微服务技术栈.黑马跟学(十二)

SpringCloud微服务技术栈.黑马跟学 十二 今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallback 1.2.消息持久化1.2.1.交换机持久化1.2.2.队列持久化1.2.3.消息持久化 1.3.消费者消息确认1.3.1.演示none模式…