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

这篇具有很好参考价值的文章主要介绍了SpringBoot开发符合S3协议的文件存储服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

公司最近的业务大量涉及安可项目,要求避免使用第三方组件,原有开发框架支持本地文件存储/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

支持功能

支持创建桶/删除桶/上传文件/删除文件/下载文件/创建文件夹功能文章来源地址https://www.toymoban.com/news/detail-597089.html

到了这里,关于SpringBoot开发符合S3协议的文件存储服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【开发环境】(阿里云分布式文件系统)对象存储OSS 服务配置

    目录 一、开通 “对象存储 OSS” 服务: 二、创建 Bucket 容器: 1.创建一个Bucket: 三、使用 OSS 对象存储: 四、使用 SDK 访问 OSS: 1.安装使用 OSS SDK: 2.SDK 配置和测试:         进入阿里云官网: https://www.aliyun.com/ https://www.aliyun.com/         进入到 OSS 对象存储的管理平台

    2024年02月02日
    浏览(67)
  • MINIO服务器基于AWS S3 SDK 文件分片上传及下载(C++实现)

    安装环境依赖: 获取SDK源码并安装: 项目中CMakeLists.txt配置: SDK文档资料 C++_SDK.pdf 实现下载的整体类代码下载 具体内容如下

    2024年04月10日
    浏览(68)
  • AWS——04篇(AWS之Amazon S3(云中可扩展存储)-02——EC2访问S3存储桶)

    关于AWS的前几篇入门文章,如下: AWS——01篇(AWS入门 以及 AWS之EC2实例及简单使用). AWS——02篇(AWS之服务存储EFS在Amazon EC2上的挂载——针对EC2进行托管文件存储). AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门). 我这里使用的都是前面创建好的,关于怎么创建,请

    2024年02月13日
    浏览(46)
  • php对接AWS S3云存储,上传S3及访问权限问题

    首先先下载sdk包 https://docs.aws.amazon.com/zh_cn/sdk-for-php/v3/developer-guide/getting-started_installation.html S3创建存储桶 去安全凭证-》创建访问秘钥 创建的时候会提示,主账号创建不安全,这个时候我们需要创建一个IAM账号来创建秘钥 创建的步骤访问这个链接 https://www.codenong.com/a513c91ea

    2024年02月10日
    浏览(41)
  • 基于S3存储的笔记应用Notea

    什么是 Notea ? Notea 是存储在 S3 上的自托管笔记应用程序, Notea 不需要数据库。笔记存储在 AWS S3 存储桶或兼容的 API 中。这意味着您可以使用 MinIO (自托管)、阿里云 OSS (如 AWS S3 )或 NAS 来存储您的数据。 什么是 S3 存储 S3 是 Amazon Web Services ( AWS ) 提供的一项服务, 它通

    2024年02月14日
    浏览(29)
  • Springboot集成MongoDB存储文件、读取文件

    可以转载,但请注明出处。    之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅。 https://www.cnblogs.com/zaoyu/p/springboot-mongodb.html   使用mongodb存储文件并实现读取,通过springboot集成mongodb操作。  可以有两种实现方式: 1. 单个文件小于16MB的,可以直接把文

    2023年04月14日
    浏览(34)
  • 大数据存储系统HDFS和对象存储(OOS/S3)的比较

      虽然Apache Hadoop以前都是使用HDFS的,但是当Hadoop的文件系统的需求产生时候也能使用S3。Netflix的 Hadoop data warehouse 利用这个特性把数据存储在S3上而不是HDFS上。笔者曾经工作经历的大数据集群存储都是用HDFS,当前工作接触到对象存储S3,在实践中比较两者的不同之处。 HD

    2024年02月12日
    浏览(44)
  • 如何使用 Cloudflare 为 S3 存储桶网站添加 HTTPS在支持 HTTPS 和自定义域的 S3 存储桶中托管静态网站

    如何使用 Cloudflare 为 S3 存储桶网站添加 HTTPS在支持 HTTPS 和自定义域的 S3 存储桶中托管静态网站 AWS S3 提供了一种将文件存储在高度可用的对象存储中的简单方法,它还支持设置静态网站。如果您不需要动态内容,那么使用 S3 存储桶是一个很有吸引力的托管选项。您几乎不需

    2024年02月04日
    浏览(57)
  • AWS s3存储桶限制IP访问

    官方参考连接: https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html 1、从控制台进入对应的存储桶,进入权限,编辑策略 2、效果 命令可以查到存储桶,但是不能查看桶里面的内容 3、在命令行修改权限 如果修改权限是时候,我上面第二条IP没有加,控制台进入对应

    2024年02月12日
    浏览(52)
  • AWS S3 存储桶复制及权限同步

    1、存储桶复制 分为2种: SCR , CCR  SCR和CCR的操作文档可以参考AWS 官方文档,这里就不重复了: 复制对象 - Amazon Simple Storage Service 使用 S3 分批复制以复制现有对象 - Amazon Simple Storage Service 授予 Amazon S3 分批操作的权限 - Amazon Simple Storage Service SCR可以同步对象的权限,不需要额

    2024年02月13日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包