前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot开发符合S3协议的文件存储服务

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

原创
作者头像
code2roc
发布2023-07-23 14:03:10
5220
发布2023-07-23 14:03:10
举报

背景

公司最近的业务大量涉及安可项目,要求避免使用第三方组件,原有开发框架支持本地文件存储/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创建
代码语言:java
复制
  @PutMapping("/{bucketName}")
  public ResponseEntity<String> createBucket(@PathVariable String bucketName)
  • Bucket删除
代码语言:java
复制
  @DeleteMapping("/{bucketName}")
  public ResponseEntity<String> deleteBucket(@PathVariable String bucketName)
  • 文件上传
代码语言:java
复制
  @PutMapping("/{bucketName}/**")
  public ResponseEntity<String> putObject(@PathVariable String bucketName, HttpServletRequest request)
  • 文件删除
代码语言:java
复制
  @DeleteMapping("/{bucketName}/**")
  public ResponseEntity<String> deleteObject(@PathVariable String bucketName, HttpServletRequest request)
  • 文件下载
代码语言:java
复制
  @GetMapping("/{bucketName}/**")
  public void getObject(@PathVariable String bucketName, HttpServletRequest request, HttpServletResponse response)
  • 文件分片操作(初始化/分片上传/合并)
代码语言:java
复制
  @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详情
代码语言:java
复制
  @RequestMapping(value = "/{bucketName}", method = RequestMethod.HEAD)
  public ResponseEntity<Object> headBucket(@PathVariable(value = "bucketName") String bucketName)
  • Buckent列表
代码语言:java
复制
  @GetMapping("/")
  public ResponseEntity<String> listBuckets()
  • 文件详情
代码语言:java
复制
  @RequestMapping(value = "/{bucketName}/**", method = RequestMethod.HEAD)
  public ResponseEntity<Object> headObject(@PathVariable String bucketName, HttpServletRequest request, HttpServletResponse response)
  • 文件列表
代码语言:java
复制
  @GetMapping("/{bucketName}")
  public ResponseEntity<String> listObjects(@PathVariable String bucketName, HttpServletRequest request)

项目接入

maven引用

代码语言:html
复制
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>2.20.45</version>
        </dependency>

客户端连接

代码语言:java
复制
    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;
    }

文件操作

代码语言:java
复制
    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选项

img
img

配置签名

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

选择签名版本为V4

img
img

支持功能

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

img
img

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 概述
  • 项目接入
  • 工具使用
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档