SpringBoot开发符合S3协议的文件存储服务

news2024/12/27 13:06:36

背景

公司最近的业务大量涉及安可项目,要求避免使用第三方组件,原有开发框架支持本地文件存储/Minio/各类云存储,现在要求文件独立存储且文件服务需要自研,经调研评估后决定基于SpringBoot开发文件存储服务,使用s3协议标准,这样可以直接使用aws-sdk接入无需再开发客户端,且安全安全性方面可以得到足够的保证(签名验证部分参考我的博文《Java实现AWS S3 V4 Authorization自定义验证》)

项目地址:https://gitee.com/code2roc/local-s3

运行jar包,默认信息如下

api地址:http://localhost:8001/s3

用户名:admin

密码:abcd@1234

概述

s3协议无标准说明文档,为rest风格,创建/删除/详情方法通过PUT/DELETE/HEAD表述

很多方法共用一个路由,通过head参数区分(例如putObject和copyObject)

参考aws的最新api文档:https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html

实现以下基础功能

  • Bucket创建

    @PutMapping("/{bucketName}")
    public ResponseEntity<String> createBucket(@PathVariable String bucketName)
    
  • Bucket删除

    @DeleteMapping("/{bucketName}")
    public ResponseEntity<String> deleteBucket(@PathVariable String bucketName)
    
  • 文件上传

    @PutMapping("/{bucketName}/**")
    public ResponseEntity<String> putObject(@PathVariable String bucketName, HttpServletRequest request)
    
  • 文件删除

    @DeleteMapping("/{bucketName}/**")
    public ResponseEntity<String> deleteObject(@PathVariable String bucketName, HttpServletRequest request)
    
  • 文件下载

    @GetMapping("/{bucketName}/**")
    public void getObject(@PathVariable String bucketName, HttpServletRequest request, HttpServletResponse response)
    
  • 文件分片操作(初始化/分片上传/合并)

    @RequestMapping(value = "/{bucketName}/**", method = RequestMethod.POST, params = "uploads")
    public ResponseEntity<Object> createMultipartUpload(@PathVariable String bucketName, HttpServletRequest request)
    
    @RequestMapping(value = "/{bucketName}/**", method = RequestMethod.PUT, params = {"partNumber", "uploadId"})
    public ResponseEntity<String> uploadPart(@PathVariable String bucketName, HttpServletRequest request, HttpServletResponse response)
    
    @RequestMapping(value = "/{bucketName}/**", method = RequestMethod.POST, params = "uploadId")
    public ResponseEntity<String> completeMultipartUpload(@PathVariable String bucketName, HttpServletRequest request)
    

实现以下扩展功能(兼容s3 browser使用)

  • Bucket详情

    @RequestMapping(value = "/{bucketName}", method = RequestMethod.HEAD)
    public ResponseEntity<Object> headBucket(@PathVariable(value = "bucketName") String bucketName)
    
  • Buckent列表

    @GetMapping("/")
    public ResponseEntity<String> listBuckets()
    
  • 文件详情

    @RequestMapping(value = "/{bucketName}/**", method = RequestMethod.HEAD)
    public ResponseEntity<Object> headObject(@PathVariable String bucketName, HttpServletRequest request, HttpServletResponse response)
    
  • 文件列表

    @GetMapping("/{bucketName}")
    public ResponseEntity<String> listObjects(@PathVariable String bucketName, HttpServletRequest request)
    

项目接入

maven引用

        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>2.20.45</version>
        </dependency>

客户端连接

    private S3Client getClient() {
        S3Client s3 = S3Client.builder()
                .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(systemConfig.getUsername(), systemConfig.getPassword())))
                .endpointOverride(URI.create(CommonUtil.getApiPath() + "s3/"))
                .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).chunkedEncodingEnabled(false).build())
                .region(Region.US_EAST_1)
                .build();
        return s3;
    }

文件操作

    public void upload(String bucketName, String key, InputStream inputStream) throws Exception {
        S3Client s3Client = getClient();
        PutObjectRequest request = PutObjectRequest.builder().bucket(bucketName).key(key).build();
        RequestBody requestBody = RequestBody.fromBytes(FileUtil.convertStreamToByte(inputStream));
        s3Client.putObject(request, requestBody);
        s3Client.close();
    }

工具使用

下载工具

链接:https://pan.baidu.com/s/1HnB3KUOQx4_QELkDTXyG2Q?pwd=nnio 提取码:nnio

配置连接

Account type:选择S3 Compatible Storage

EndPoint填写部署服务后的地址:http://ip:port/s3

Access Key ID:填写配置文件中的username

Secret Access Key:填写配置文件中的password

去除SSL选项
在这里插入图片描述

配置签名

在编辑连接页面点击左下角Advanced S3 Compatible Storage Setting

选择签名版本为V4

在这里插入图片描述

支持功能

支持创建桶/删除桶/上传文件/删除文件/下载文件/创建文件夹功能

在这里插入图片描述

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

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

相关文章

知识库数据导出为excel-使用JavaScript实现在浏览器中导出Excel文件

我们智能客服知识库机器人已经开发完成&#xff0c;后端数据库是使用的qdrant向量数据库&#xff0c;但是该数据库并没有导出备份功能&#xff0c;所以我按简单的纯前端实现知识库导出excel数据 使用第三方库(如SheetJS) SheetJS是一个流行的JavaScript库&#xff0c;可帮助处理…

Linux の shell 基本语法

变量 shell中变量比较特殊&#xff0c;变量名和等号之间不能有空格。其它的跟常见的变成语言类似 命名规则&#xff1a; 命名只能使用英文字母&#xff0c;数字和下划线&#xff0c;首个字符不能以数字开头。 中间不能有空格&#xff0c;可以使用下划线 _。 不能使用标点符号。…

了解一下启动类如何运行

Run 我最初以为就是运行了一个main方法&#xff0c;没想到去开启了一个服务。 package com.qf;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //SpringBootApplication&#xff1a;标注这个类是…

Maven的热部署devtools

最近在搞springbootmaven项目&#xff0c;每次重启很烦人&#xff0c;才想起以前的热部署devtool依赖没添加。 在搭建springboot项目中往controller类加入注解RestController RequestMapping后&#xff0c;我们就可以通过http请求访问结果&#xff0c;可当我修改代码或增加文件…

ElasticSearch学习--搜索

目录 DSL查询文档 DSL查询分类 match_all 总结 全文检索查询 match multi_match​编辑 总结 精准查询 ids range&#xff0c;term 地理坐标查询 geo_bounding_box geo_distance 组合(复合)查询 总结 Function Score Query 复合查询Boolean Query 案例 搜索结果处…

菜鸡shader:L12 SD处理贴图制作时钟动画

文章目录 SD处理贴图Shader代码C#代码最后效果 SD处理贴图 呃呃感觉这节课&#xff0c;很大一部分都是在将怎么用SD来处理贴图&#xff0c;在这里就简单放一下课上的截图吧&#xff0c;我也跟着做了一下&#xff0c;虽然表盘十二个数排列间隔不一样&#xff0c;但还是稀碎地做…

【ARM Cache 系列文章 2 -- Cache Coherence及内存顺序模学习】

文章目录 Cache Coherence 背景1.1 内存顺序模型简介(Memory Model)1.1.1 Normal Memory1.1.2 Device Memory 1.2 Cache 一致性问题解决方案1.2.1 Shareability 属性1.2.2 Non-Shareable 属性1.2.3 Inner-Shareable 属性1.2.4 Out-Shareable 属性 1.3 Shareability 和 PoC/PoU …

【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比

【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比 注意事项 不同版本matlab 不同电脑 加上数据集随机&#xff0c;BP权值阈值随机&#xff0c;进化算法种群随机&#xff0c;所以运行结果不一定和我运行…

20.matlab数据分析极限(matlab程序)

1.简述 计算极限 MATLAB提供计算极限的limit函数。在其最基本的形式中&#xff0c;limit函数将表达式作为参数&#xff0c;并在独立变量为零时找到表达式的极限。 例如&#xff0c;要计算函数f(x)(x^3 5)/(x^4 7)的极限&#xff0c;因为x趋向于零。 syms xlimit((x^3 5)/…

设计模式 ~ 职责链、策略、适配器、MVC、MVVM

职责链模式 一种行为型设计模式&#xff0c;它允许多个对象按照特定的顺序处理请求&#xff0c;直到其中一个对象能够处理该请求为止&#xff1b; 一个流程&#xff0c;需要多个角色处理&#xff0c;通过 一个“链”串联起来&#xff0c;各个角色相互分离&#xff0c;互不干扰…

使用 Cpolar 内网穿透实现 Windows 远程 WebDAV 访问

文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户…

机器学习术语解析与应用(一)

文章目录 &#x1f340;引言&#x1f340;数据集&#x1f340;特征工程&#xff08;Feature Engineering&#xff09;&#x1f340;模型&#xff08;Model&#xff09;&#x1f340;算法&#xff08;Algorithm&#xff09;&#x1f340;训练&#xff08;Training&#xff09;&a…

【广州华锐互动】VR汽车故障维修模拟系统

随着汽车行业的发展&#xff0c;汽车机械检修技术也变得越来越重要。传统的教学方式已经不能满足现代汽车维修的需求&#xff0c;因此VR汽车故障维修模拟系统应运而生。这个平台具有许多实用的功能&#xff0c;可以帮助学生更好地学习和掌握汽车机械检修技能。 VR汽车故障维修模…

【Linux】无法获得dpkg前端锁的解决方法

问题如下&#xff1a; 解决方法如下&#xff1a; sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/cache/apt/archives/lock经过证明&#xff0c;输入以上三个命令即可解除占用。 解除后&#xff0c;继续运行apt命令&#xff0c;已经顺利运行了…

2023-07-19-Ubuntu火狐浏览器不能播放视频

layout: post # 使用的布局 title: Ubuntu火狐浏览器不能播放视频 # 标题 subtitle: linux系统 #副标题 date: 2023-07-19 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/no_found_html5.jpg #这篇文章标题背景图片 catalog: true # 是否归档 tags: Ubuntu #标签 …

vue实现excel数据下载,后端提供的list由前端转excel并下载

前言,因为项目需求需要,我们需要把后端传来的list转成excel模板,并且下载下来) 之前有用的插件,但是会有少0的情况,如下 所以采用另一个项目用过的方法,最终完美实现效果,如下: 1,首先我们来看下后端提供的数据结构 2,具体前端代码如下 封装的组件,需要的同学直接copy就行(这…

【Linux】VMware 安装 Centos7 超详细

1、下载✈ VMware链接&#xff1a;https://pan.baidu.com/s/1DnleWeV-JHjZiV9_ENwFmg?pwdb1tj 提取码&#xff1a;b1tj 阿里云镜像&#xff1a;centos安装包下载_开源镜像站-阿里云 CentOS官网镜像&#xff1a; Download 2、虚拟机准备 2.1、打开VMware选择新建虚拟机…

vector 容器相关的练习

目录 一、只出现一次的数字 二、只出现一次的数字 II 三、只出现一次的数字 III 四、删除有序数组中的重复项 五、杨辉三角 六、数组中出现次数超过一半的数字 七、电话号码的字母组合 一、只出现一次的数字 class Solution { public:int singleNumber(vector<int&g…

springboot()—— springboot整合mybatis

总结&#xff1a; 和SSM相比&#xff0c; 1&#xff09;导入的包不同 2&#xff09;不再有mybatis的核心配置文件了&#xff0c;也不同单独写db.properties了&#xff0c;以前“开启二级缓存&#xff0c;起别名”等在核心配置文件里的配置全都配置到application.properties里…

前端实现文件上传的方式

这个文章总结了四种前端上传文章的方式 <inputtype"file"multipleonChange{(e) > {const c [].slice.call(e.target.files);console.log(e.target.files, e.target.files);console.log(e.target.files.arrary, c);const v new FormData();v.append(file, c[…