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

news/2024/12/2 20:27:35/

前段时间使用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;彼时类…