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

news2024/11/16 12:29:51

前段时间使用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.com
      access-key: admin
      secret-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,调用相关方法即可

    @Autowired
    private 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 ,调用原始方法

    @Autowired
    private 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.coloradmin.cn/o/431312.html

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

相关文章

打造高效的跑腿配送系统,分享源码与经验

打造高效的跑腿配送系统&#xff0c;则是每一个快递公司和物流企业所追求的目标。在这篇文章中&#xff0c;我们将分享一些跑腿配送系统源码的技术解析、跑腿系统骑手端、商家端的优点以及跑腿配送相关的功能点介绍。 一、跑腿配送系统源码的技术解析 跑腿配送系统源码主要采…

1679_电子生产中的治具了解

全部学习汇总&#xff1a; GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! (github.com) 工作中切换了一下角色&#xff0c;做…

安装pyinstaller打包EXE

安装pyinstaller pycharm 左下角&#xff0c;打开包管理器 左上角输入要搜索的包 右上角点击安装 安装完后在 File - Settings - Projecxt:XXX 中设置 Python Interpreter 设置系统环境变量 打包时报错&#xff1a;找不到pyinstaller命令 pyinstaller : 无法将“pyinstal…

自动控制原理模拟卷4

自动控制原理模拟题四 Question1 仓库大门自动开闭控制系统原理图如下图所示,说明系统自动控制大门开闭的工作原理并画出系统方块图; 解: 当合上开门开关时,电位器桥式测量电路产生一个偏差电信号;此偏差电压经放大器放大后,驱动伺服电动机带动绞盘转动,使大门提起;与…

五、Locust之HTTP用户类

HttpUser是最常用的用户。它增加了一个客户端属性&#xff0c;用来进行HTTP请求。 from locust import HttpUser, task, betweenclass MyUser(HttpUser):wait_time between(5, 15)task(4)def index(self):self.client.get("/")task(1)def about(self):self.client.…

Python标准库 --- json库

目录 一、简介 二、属性 三、数据格式 一、简介 Json&#xff0c;全称JavaScript Object Notation&#xff0c;也就是JavaScript对象标记&#xff0c;通过对象和数组的组合表示数据&#xff0c;虽然构造简洁但是结构化程度非常高&#xff0c;是一种轻量级的数据交换格式。J…

ftp-vsftpd(Centos)

一.关闭selinux跟防火墙 setenforce 0 systemctl stop firewalld 二.安装vsftpd yum install vsftpd -y 三.创建虚拟用户与目录并申请证书 mkdir /webdata 根目录 chmod 777 /webdata/ useradd webadmin 上传的文件映射为webadmin vim user webuser虚拟用户 通过d…

Android---内存泄漏检测核心原理

目录 LeakCanary 核心原理 LeakCanary 检测对象的类型 ReferenceQueue 与 WeakReference LeakCanary 里的监控列表与保留列表 常见内存泄漏案例 1. 单例导致内存泄漏 2. 静态变量导致内存泄漏 3. 非静态内部类导致内存泄漏 4. 未取消注册或回调导致内存泄漏 5. Timer…

paddleocr 实操笔记 (前向后梳理)

要点&#xff1a; 参考&#xff1a; 基于PaddleOCR的数字显示器字符识别 工业仪表数值识别 前言 问题分析 要处理电表中的数据&#xff0c;可以分为步骤&#xff0c;拆解为以下问题&#xff1a; 感兴趣区域定位问题OCR读数问题 针对问题1,经过实验与探索&#xff0c;也找到…

黑马---Redis入门到实战【基础篇】

一、初识Redis 认识NoSql redis是键值数据库&#xff0c;没有表、没有约束&#xff0c;存的都是键值对&#xff0c;称为NoSql数据 NoSQL VS SQL 认识Redis Redis诞生于2009年&#xff0c;全称Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存…

开篇:为什么学习 Go 语言

简介 Go 语言又称 Golang&#xff0c;由 Google 公司于 2009 年发布&#xff0c;近几年伴随着云计算、微服务、分布式的发展而迅速崛起&#xff0c;跻身主流编程语言之列&#xff0c;和 Java 类似&#xff0c;它是一门静态的、强类型的、编译型编程语言&#xff0c;为并发而生…

高等数学笔记(上下)

目录 不定积分定积分微分方程线性微分方程解的结构常系数齐次线性微分方程常系数齐次线性微分方程特解的求法 计算机解法 不定积分 第一类换元积分法&#xff1a;灵感来自于复合函数的求导&#xff0c;利用中间变量替换得到复合函数的积分法&#xff1a;设 f ( u ) f(u) f(u)具…

【Redis7】Redis7 事务管道发布订阅

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 事务、管道和发布订阅。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【Redis7】Redis7 持…

Qt扫盲-QXYSeries理论总结

QXYSeries理论总结 一、概述二、常用函数介绍1. 维护点2. 绘图相关3. 绘制标签 三、信号说明1. Point 增删相关2. Point 鼠标相关3. 图变化相关 一、概述 QXYSeries 类是折线图、曲线图、散点图的基类。这个类其实就是维护的是图线的相关信息&#xff0c;就比如是这个线条的颜…

5、cmake的简单认识及CMakeLists.txt的编写语法

文章目录 1、cmake是什么&#xff08;1&#xff09;cmake的两大功能 2、CMakeLists.txt常用命令&#xff08;即如何编写CMakeLists.txt文件&#xff09;&#xff08;1&#xff09;cmake常见预定义1&#xff09;常见的预定义变量2&#xff09;系统信息预定义变量3&#xff09;开…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号&#xff1a;AI-era Meta的LLaMA模型开源&#xff0c;让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到&#xff0c;一次意外的LLaMA泄漏&#xff0c;竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

Linux系统网络传输之端口详解

Linux系统网络传输之端口详解 1、端口的概念2、安装namp3、查看端口占用情况4、安装net-tools5、查看指定端口占用情况 1、端口的概念 计算机程序之间的通讯&#xff0c;通过IP只能锁定计算机&#xff0c;但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xf…

《花雕学AI》深度测试ChatGPT国内镜像站:超简单提示词的猫娘角色扮演,真的好神奇啊!

偶然看过一篇讲解如何使用ChatGPT调教猫娘的文章&#xff0c;有六个步骤&#xff0c;许许多多的调教提示语&#xff0c;让我感觉这是一件非常复杂与专业的事情。今天有空&#xff0c;于是就想先从简单的开始尝试一下。我使用了最简单的提示词&#xff1a;”ChatGPT角色扮演猫娘…

分布式事务Seata实践入门

1 前言 现在应用基本上都是分布式部署&#xff0c;那么针对分布式事务问题&#xff0c;也有对应的解决方案。经过简单的调研&#xff0c;最后选择了阿里的 Seata 组件&#xff0c;来实现分布式事务。 Seata是2019年1月份&#xff0c;蚂蚁金服和阿里巴巴共同开源的分布式事务解…

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念

&#xff08;TinkSystem SR650&#xff09;安装服务器操作系统&#xff08;Windows Server 2022&#xff09;步骤和相关概念 服务器操作系统安装步骤 记录一下服务器操作系统安装过程&#xff0c;虽然简单但还是有一些坑需要注意&#xff0c;本次使用的是联想服务器ThinkSyst…