SpringBoot整合AWS S3
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相关推荐
- springboot整合amazonS3,封装上传文件接口
之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...
- AWS S3云存储服务
AWS S3云存储服务 1 S3概念及基础知识 2 S3的基本操作 3 S3数据安全 4 S3数据加密以及命令行CLI 4.1 S3加密工作原理 4.1.1 server端的加密 4.1.2 clie ...
- AWS S3宕机的启发: 云必须分散化
上周,AWS S3云存储服务中断,互联网圈掀起一番波澜,然而AWS将其因归咎于一名技术人员在例行维修中的失误,关闭了S3子系统的少量服务器,由于一条错误的指令输入,被关闭的服务器比预期要多.事情过去了 ...
- springboot 整合kafka 实现生产,消费数据
一 kafka集群的启动 1.1 机器说明 192.168.152.128 master 192.168.152.129 slaver01 192.168.152.130 slaver02 1.2 查 ...
- s3 aws_您需要了解的有关AWS S3的所有信息
s3 aws This article will provide an in-depth introduction to AWS S3 - the secure, scalable, and supe ...
- aws s3 静态网站_如何将静态网站或JAMstack应用托管并部署到AWS S3和CloudFront
aws s3 静态网站 S3 and CloudFront are AWS cloud services that make serving static assets powerful and ch ...
- k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署
k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...
- SpringBoot第九篇: springboot整合Redis
这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...
- es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch
ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...
最新文章
- 使用JDBC进行MySQL 5.1的数据连接、查询、修改等操作练习。
- c语言中程序偏离,C语言中的指针加减偏移量
- aspects to consider for a recommendation letter
- boost::posix_time模块实现闹钟的测试程序
- 【MySql】 BlackHole :黑洞引擎
- scala学习-类与对象
- JavaScript高级之ECMAScript 6 新特性
- 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
- 99+好友共同关注,公众号推荐
- Razor 中的@rendersection
- Python3+Selenium3+Unittest+ddt+Requests 接口自动化测试框架
- windows下JDK版本之间的切换
- Qt获取音频输入和输出设备
- C语言中数组名的使用总结
- rest api是什么_什么是REST API?
- CF连杀喊话_WeGame修改
- Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
- 这款免费开源的数据库工具,支持所有主流数据库!
- Java开发环境搭建步骤
- pandas读写表格