SpringBoot整合AWS S3


文章目录

  • SpringBoot整合AWS S3
  • 前言
  • 一、AWS S3是什么?
  • 二、使用步骤
    • 1、准备工作
      • 1、MinIO搭建与配置
      • 2、引入依赖
    • 2、补充配置
    • 3、封装工具类
      • 1 、配置类
      • 2 、文件工具类
      • 3 、测试类
    • 4、测试
      • 1、上传测试
      • 2、下载测试
    • 7、仓库地址
    • 6、总结

前言

一、AWS S3是什么?

amazon (S3) 是一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。 S3 提供一个 RESTful API 以编程方式实现与该服务的交互。(来源百度百科)

简单来说就是所有支持S3协议的都可以使用这个进行文件上传或者下载等操作。
本文使用开源的MinIO进行演示

二、使用步骤

1、准备工作

1、MinIO搭建与配置

搭建按照官方操作即可

搭建完成之后需要创建一个用户

拿到对应的信息

2、引入依赖

 <!-- aws-java-sdk-s3 --><dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.12.362</version></dependency><!-- commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

2、补充配置

在配置文件中添加配置
一个是S3的配置,一个是文件上传文件大小限制

#AWS S3配置
aws:s3:accessKey: 配置的信息secretKey: 配置的信息url: http://你的ip:端口bucket: 桶名称
#    文件上传限制
spring:servlet:multipart:max-file-size: 100MBmax-request-size: 100MB

3、封装工具类

1 、配置类

@Data
@Configuration
@ConfigurationProperties(prefix = "aws.s3")
public class AwzS3Config {private String accessKey;private String secretKey;private String url;private String bucket;
}

2 、文件工具类

@Component
public class AwzS3Util {@Resourceprivate AwzS3Config injectAwzS3Config;private static AwzS3Config awzS3Config;private static AmazonS3 amazonS3;@PostConstructpublic void init() {awzS3Config = this.injectAwzS3Config;AWSCredentials credentials = new BasicAWSCredentials(awzS3Config.getAccessKey(), awzS3Config.getSecretKey());AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);AwsClientBuilder.EndpointConfiguration endpointConfig =new AwsClientBuilder.EndpointConfiguration(awzS3Config.getUrl(), Regions.CN_NORTH_1.getName());ClientConfiguration config = new ClientConfiguration();config.setSignerOverride("S3SignerType");config.setProtocol(Protocol.HTTP);config.withUseExpectContinue(false);config.disableSocketProxy();amazonS3 = AmazonS3Client.builder().withEndpointConfiguration(endpointConfig).withClientConfiguration(config).withCredentials(credentialsProvider).disableChunkedEncoding().withPathStyleAccessEnabled(true).withForceGlobalBucketAccessEnabled(true).build();}/*** 创建桶** @return boolean* @params * @param bucket* @author susj* @date 2022/12/12 16:39*/public static boolean createBucket(String bucket) {if (StringUtils.isNullOrEmpty(bucket)) {throw new IllegalArgumentException("桶名称不能为空!");}try {amazonS3.createBucket(bucket);} catch (SdkClientException e) {e.printStackTrace();return false;}return true;}/*** 删除桶** @return boolean* @params * @param bucket* @author susj* @date 2022/12/12 16:39*/public static boolean deleteBucket(String bucket) {if (StringUtils.isNullOrEmpty(bucket)) {throw new IllegalArgumentException("桶名称不能为空!");}try {amazonS3.deleteBucket(bucket);} catch (SdkClientException e) {e.printStackTrace();return false;}return true;}/*** 上传文件** @param bucket 桶名称* @return boolean* @params * @param file* @author susj* @date 2022/12/12 16:33*/public static boolean upload(MultipartFile file, String bucket) {if (Objects.isNull(file)) {throw new IllegalArgumentException("文件不能为空!");}String fileName = file.getOriginalFilename();ObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentType(file.getContentType());objectMetadata.setContentLength(file.getSize());bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;try {PutObjectRequest request = new PutObjectRequest(bucket, fileName, file.getInputStream(), objectMetadata)// 设置文件访问权限.withCannedAcl(CannedAccessControlList.BucketOwnerFullControl);PutObjectResult result = amazonS3.putObject(request);} catch (IOException e) {e.printStackTrace();return false;}return true;}/*** 通过文件名称下载** @param fileName* @return org.springframework.http.ResponseEntity<byte [ ]>* @params * @param bucket* @author susj* @date 2022/12/12 16:56*/public static ResponseEntity<byte[]>    downloadByName(String bucket, String fileName) throws IOException {if (StringUtils.isNullOrEmpty(bucket)) {throw new IllegalArgumentException("文件名称不能为空!");}bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, fileName);S3Object s3Object = amazonS3.getObject(getObjectRequest);S3ObjectInputStream objectInputStream = s3Object.getObjectContent();byte[] bytes = IOUtils.toByteArray(objectInputStream);// 替换中文String showFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);httpHeaders.setContentLength(bytes.length);httpHeaders.setContentDispositionFormData("attachment", showFileName);return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);}/*** 删除单个文件** @param fileName* @return boolean* @params * @param bucket* @author susj* @date 2022/12/12 17:04*/public static boolean deleteFile(String bucket, String fileName) {if (StringUtils.isNullOrEmpty(fileName)) {throw new IllegalArgumentException("文件名称不能为空!");}bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;try {amazonS3.deleteObject(bucket, fileName);} catch (SdkClientException e) {e.printStackTrace();return false;}return true;}/*** 获取文件信息** @param fileName* @return com.amazonaws.services.s3.model.ObjectMetadata* @params * @param bucket* @author susj* @date 2022/12/12 17:08*/public static ObjectMetadata getFileInfo(String bucket, String fileName) {if (StringUtils.isNullOrEmpty(fileName)) {throw new IllegalArgumentException("文件名称不能为空!");}bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;ObjectMetadata objectMetadata = null;try {objectMetadata = amazonS3.getObjectMetadata(bucket, fileName);} catch (SdkClientException e) {e.printStackTrace();}return objectMetadata;}
}

3 、测试类

@RestController
@RequestMapping("awz/s3")
public class S3Controller {@PostMapping(value = "/uploadObject")public ResponseEntity uploadObject(MultipartFile file, String bucket) {try {AwzS3Util.upload(file, bucket);} catch (Exception e) {e.printStackTrace();}return new ResponseEntity("上传成功!", HttpStatus.OK);}@PostMapping(value = "/downloadObject")public ResponseEntity downloadObject(String bucket, String fileName) {ResponseEntity<byte[]> download = null;try {download = AwzS3Util.downloadByName(bucket, fileName);} catch (Exception e) {e.printStackTrace();}return download;}@PostMapping(value = "/getFileInfo")public ObjectMetadata getFileInfo(String bucket, String fileName) {return AwzS3Util.getFileInfo(bucket, fileName);}}

4、测试

1、上传测试

上传成功在管理页面也看到了文件

2、下载测试

下载成功

7、仓库地址

https://gitee.com/xyzissj/minio.git

6、总结

这里只是简单封装一下,具体实际使用需要根据实际需求处理

这边网上有一个个人的开源项目:X Spring File Storage
由于是个人的开源项目,所以是否使用请自己甄别,如有任何问题与本人无关。

SpringBoot整合AWS S3相关推荐

  1. springboot整合amazonS3,封装上传文件接口

    之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...

  2. AWS S3云存储服务

    AWS S3云存储服务 1 S3概念及基础知识 2 S3的基本操作 3 S3数据安全 4 S3数据加密以及命令行CLI 4.1 S3加密工作原理 4.1.1 server端的加密 4.1.2 clie ...

  3. AWS S3宕机的启发: 云必须分散化

    上周,AWS S3云存储服务中断,互联网圈掀起一番波澜,然而AWS将其因归咎于一名技术人员在例行维修中的失误,关闭了S3子系统的少量服务器,由于一条错误的指令输入,被关闭的服务器比预期要多.事情过去了 ...

  4. springboot 整合kafka 实现生产,消费数据

    一 kafka集群的启动 1.1 机器说明 192.168.152.128 master 192.168.152.129 slaver01 192.168.152.130 slaver02 1.2 查 ...

  5. s3 aws_您需要了解的有关AWS S3的所有信息

    s3 aws This article will provide an in-depth introduction to AWS S3 - the secure, scalable, and supe ...

  6. aws s3 静态网站_如何将静态网站或JAMstack应用托管并部署到AWS S3和CloudFront

    aws s3 静态网站 S3 and CloudFront are AWS cloud services that make serving static assets powerful and ch ...

  7. k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署

    k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...

  8. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  9. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

最新文章

  1. 使用JDBC进行MySQL 5.1的数据连接、查询、修改等操作练习。
  2. c语言中程序偏离,C语言中的指针加减偏移量
  3. aspects to consider for a recommendation letter
  4. boost::posix_time模块实现闹钟的测试程序
  5. 【MySql】 BlackHole :黑洞引擎
  6. scala学习-类与对象
  7. JavaScript高级之ECMAScript 6 新特性
  8. 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
  9. 99+好友共同关注,公众号推荐
  10. Razor 中的@rendersection
  11. Python3+Selenium3+Unittest+ddt+Requests 接口自动化测试框架
  12. windows下JDK版本之间的切换
  13. Qt获取音频输入和输出设备
  14. C语言中数组名的使用总结
  15. rest api是什么_什么是REST API?
  16. CF连杀喊话_WeGame修改
  17. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
  18. 这款免费开源的数据库工具,支持所有主流数据库!
  19. Java开发环境搭建步骤
  20. pandas读写表格

热门文章

  1. 数据类型分为两大种:
  2. 航空叶片检测之相关名词解释
  3. cips铁路系统服务器,编组站综合自动化系统(CIPS)
  4. xbox服务器中断,Xbox Live服务出现重大中断 目前问题已基本解决
  5. Cloudways托管平台简化了网站托管体验
  6. DevExpress WPF的电子表格组件,让您更快获得Excel体验(二)
  7. 快讯:新一届“教指委”成立大会,今日在京隆重举行
  8. HNUST 2204 买水果
  9. 【算法百题之十八】18年网易面试题,小易买水果
  10. Oracle EBS 汇率类型解释