spring boot 对接aws 的S3 服务,实现上传和查询
1.aws S3介绍
AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能:
1.1. 对象存储
- 对象存储模型:S3使用对象存储模型,数据以对象的形式存储在桶(Bucket)中。每个对象由数据、元数据和唯一的标识符(键)组成。
- 桶(Bucket):桶是存储对象的容器。每个桶都有一个唯一的名称,并且可以在全球范围内访问。
1.2. 高可用性和耐久性
- 耐久性:S3提供99.999999999%(11个9)的数据耐久性,确保数据在多个设施中冗余存储。
- 高可用性:S3设计为具有高可用性,确保用户可以随时访问存储的数据。
1.3. 可扩展性
- 弹性扩展:S3可以自动扩展以处理任意数量的数据和请求,无需用户进行容量规划。
1.4. 安全性
- 访问控制:S3提供多种访问控制机制,包括桶策略、IAM策略和ACL(访问控制列表),以确保只有授权用户能够访问数据。
- 加密:支持在传输和静态存储时对数据进行加密,提供多种加密选项,包括服务器端加密(SSE)和客户端加密。
1.5. 数据管理和分析
- 版本控制:S3支持对象版本控制,允许用户保留和恢复对象的多个版本。
- 生命周期管理:用户可以设置生命周期规则,以自动转移或删除不再需要的数据。
- 事件通知:S3可以配置事件通知,以便在对象创建、删除等操作时触发Lambda函数、SNS通知等。
1.6. 集成和兼容性
- 与其他AWS服务集成:S3与AWS的其他服务(如EC2、Lambda、CloudFront等)无缝集成,支持数据分析、备份、内容分发等多种场景。
- 兼容性:S3兼容RESTful API,支持多种编程语言和SDK,方便开发者进行集成和使用。
1.7. 使用场景
- 备份和恢复:用于数据备份和恢复解决方案。
- 静态网站托管:可以托管静态网站,支持自定义域名和HTTPS。
- 大数据分析:用于存储和分析大数据集,支持与AWS Glue、Amazon Athena等服务集成。
- 媒体存储:用于存储和分发音频、视频和图像等媒体文件。
1.8. 定价
- 按需计费:S3采用按需计费模式,用户只需为实际使用的存储空间和请求付费。定价根据存储类型、数据传输和请求数量等因素而异。
2.AWS的访问密钥(Access Key)和秘密密钥(Secret Key)
要获取AWS的访问密钥(Access Key)和秘密密钥(Secret Key),请按照以下步骤操作:
2.1. 登录到AWS管理控制台
访问 AWS管理控制台 并使用你的AWS账户登录。
2.2. 访问IAM(身份与访问管理)
- 在控制台主页,找到并点击“IAM”服务。
- 在左侧菜单中,选择“用户”。

2.3. 创建新用户(如果需要)
如果你还没有用户,或者想为特定的应用创建一个新用户,可以按照以下步骤创建:
- 点击“添加用户”。
- 输入用户名,并选择“编程访问”选项。
- 点击“下一步:权限”。

2.4. 设置权限

- 你可以选择将用户添加到现有的用户组,或者直接为用户附加权限策略。
- 如果你只需要S3的访问权限,可以选择“创建策略”,并使用以下JSON示例来创建一个只允许访问S3的策略:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "s3:*","Resource": "*"}]
}
- 完成后,点击“下一步:标签”,然后点击“下一步:查看”。
- 确认信息无误后,点击“创建用户”。
2.5. 获取访问密钥和秘密密钥
- 创建用户后,你将看到一个成功页面,其中包含“访问密钥 ID”和“秘密访问密钥”。
- 注意:秘密访问密钥只会在此时显示一次,请务必将其安全保存。如果丢失,你需要重新生成密钥。
2.6. 配置密钥
将获取到的“访问密钥 ID”和“秘密访问密钥”填入你的application.properties文件中:
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY
cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
2.7. 安全性注意事项
- 不要将密钥硬编码:在生产环境中,建议使用环境变量或AWS Secrets Manager来管理密钥。
- 最小权限原则:只授予用户所需的最小权限,以降低安全风险。
- 定期轮换密钥:定期更换访问密钥以增强安全性。
通过以上步骤,你就可以获取AWS的访问密钥和秘密密钥,并在Spring Boot应用中进行配置。
3.代码工程
要在Spring Boot应用中对接AWS S3服务,实现文件的上传和查询,你可以按照以下步骤进行:
3.1. 添加依赖
在你的pom.xml中添加AWS SDK的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>aws-s3</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.12.300</version> <!-- 请根据需要选择合适的版本 --></dependency></dependencies>
</project>
3.2. 配置AWS凭证
你可以通过环境变量、系统属性或配置文件来配置AWS凭证。以下是使用application.properties的示例:
cloud.aws.credentials.access-key=xxxx cloud.aws.credentials.secret-key=xxxx cloud.aws.region.static=xxx cloud.aws.s3.bucket=xxx proxy.host=127.0.0.1 proxy.port=1080
3.3. 创建S3配置类
创建一个配置类来初始化S3客户端:
package com.et.aws.config;import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.net.InetSocketAddress;
import java.net.Proxy;@Configuration
public class S3Config {@Value("${cloud.aws.credentials.access-key}")private String accessKey;@Value("${cloud.aws.credentials.secret-key}")private String secretKey;@Value("${cloud.aws.region.static}")private String region;@Value("${proxy.host:}") // 代理主机private String proxyHost;@Value("${proxy.port:}") // 代理端口private int proxyPort;@Beanpublic AmazonS3 amazonS3() {BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withRegion(region).withCredentials(new AWSStaticCredentialsProvider(awsCredentials));// 如果代理主机和端口不为空,则配置代理if (!proxyHost.isEmpty() && proxyPort > 0) {Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));builder.withClientConfiguration(new ClientConfiguration().withProxyHost(proxyHost).withProxyPort(proxyPort));}return builder.build();}
}
3.4. 实现文件上传和查询功能
创建一个服务类来处理文件的上传和查询:
package com.et.aws.service;import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;@Service
public class S3Service {@Autowiredprivate AmazonS3 amazonS3;@Value("${cloud.aws.s3.bucket}")private String bucketName;public String uploadFile(MultipartFile file) throws IOException {String fileName = file.getOriginalFilename();InputStream inputStream = file.getInputStream();amazonS3.putObject(bucketName, fileName, inputStream, null);return fileName;}public List<String> listFiles() {ObjectListing objectListing = amazonS3.listObjects(bucketName);List<String> fileNames = new ArrayList<>();for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {fileNames.add(objectSummary.getKey());}return fileNames;}
}
3.5. 创建控制器
创建一个控制器来处理HTTP请求:
package com.et.aws.controller;import com.et.aws.service.S3Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.List;@RestController
@RequestMapping("/api/s3")
public class S3Controller {@Autowiredprivate S3Service s3Service;@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {try {String fileName = s3Service.uploadFile(file);return ResponseEntity.ok("File uploaded: " + fileName);} catch (IOException e) {return ResponseEntity.status(500).body("File upload failed: " + e.getMessage());}}@GetMapping("/files")public ResponseEntity<List<String>> listFiles() {List<String> files = s3Service.listFiles();return ResponseEntity.ok(files);}
}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
- GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(aws-s3)
4. 测试
启动你的Spring Boot应用,并使用Postman或其他工具测试文件上传和查询功能。
上传文件:
发送POST请求到/api/s3/upload,并在请求中附加文件。

查询文件:
发送GET请求到/api/s3/files,将返回存储在S3中的文件列表。

注意事项
- 确保你的AWS IAM用户具有对S3的访问权限。
- 根据需要处理异常和错误情况。
- 你可以根据需要扩展功能,例如文件删除、文件下载等。
通过以上步骤,你就可以在Spring Boot应用中成功对接AWS S3服务,实现文件的上传和查询。
5.引用
- Cloud Computing Services - Amazon Web Services (AWS)
- https://docs.aws.amazon.com/s3/?icmpid=docs_homepage_featuredsvcs
- spring boot 对接aws 的S3 服务,实现上传和查询 | Harries Blog™
相关文章:
spring boot 对接aws 的S3 服务,实现上传和查询
1.aws S3介绍 AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能: 1.1. 对象存储 对象存储模型:S3使用…...
25/2/16 <算法笔记> DirectPose
DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…...
数据结构-8.Java. 七大排序算法(下篇)
本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 下篇主要实现最后一种排序算法: 归并排序。同时把中篇剩下的快排非递归实现补上. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是…...
缓存穿透、缓存击穿、缓存雪崩的区别与解决方案
1. 缓存穿透(Cache Penetration) 定义:大量请求查询 数据库中不存在的数据,导致请求绕过缓存直接访问数据库,造成数据库压力过大。 场景: 恶意攻击:例如用不存在的用户ID频繁请求。 业务误操作…...
DeepSeek私有化部署+JAVA通过API调用离线大模型问答
在当今快速发展的数字化时代,企业对于高效、灵活的技术解决方案需求日益增长。DeepSeek作为一款领先的智能搜索与分析平台,凭借其强大的数据处理能力和精准的搜索结果,已经成为众多企业提升运营效率的得力助手。为了更好地满足企业对数据安全…...
【go语言规范】Gopherfest 2015 | Go Proverbs with Rob Pike的 总结
根据 Gopherfest 2015 | Go Proverbs with Rob Pike 的演讲,总结内容如下: 虽然已是十年前的产物,但是proverbs的价值依旧存在 以下是整合补充内容后的完整总结,涵盖 Rob Pike 在 Gopherfest 2015 演讲 “Go Proverbs” 中的核心…...
【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版
针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...
内容中台驱动企业数字化内容管理高效协同架构
内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...
【第14章:神经符号集成与可解释AI—14.4 神经符号集成与可解释AI的未来发展趋势与挑战】
想象一下,如果AI既能像人类一样直觉感知(比如一眼认出街角的咖啡店),又能像数学家一样逻辑推理(比如计算最优路线避开拥堵),这个世界会变成什么样?这种“双脑协同”正是神经符号集成技术的终极目标。 但现实是,当前99%的AI系统要么只会“死记硬背”数据(如深度学习模…...
[JVM篇]虚拟机性能监控、故障处理工具
虚拟机性能监控、故障处理工具 基础故障处理工具 jps(JVM Peocess Status Tool - 虚拟机进程状况工具) jstat(JVM Statistics Monitoring Too - 虚拟机统计信息监视工具) jinfo( Configuration info for Java - Java配置信息工具) jmap(Memory Map for…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_t 类型
ngx_cycle_t 定义在 src/core/ngx_core.h typedef struct ngx_cycle_s ngx_cycle_t; ngx_cycle_s 定义在 src/core/ngx_cycle.h struct ngx_cycle_s {void ****conf_ctx;ngx_pool_t *pool;ngx_log_t *log;ngx_log_t …...
WHERE子句中的条件
在SQL查询中,WHERE子句用于指定筛选条件,以限制从数据库表中检索出的数据行。WHERE子句通常位于SELECT、UPDATE、DELETE等SQL语句中,紧跟在FROM子句(对于SELECT语句)或其他相关子句之后。 一、WHERE子句的基本语法 sq…...
Effective Objective-C 2.0 读书笔记——内存管理(下)
Effective Objective-C 2.0 读书笔记——内存管理(下) 在 dealloc 方法中只释放引用并解除监听 对象在经历其生命期后 ,最终会为系统所回收 ,这时就要执行dealloc 方法了。 在每个对象的生命期内,此方法仅执行一次&a…...
[Spring Boot] Expense API 实现
[Spring Boot] Expense API 实现 项目地址:expense-api 项目简介 最近跟着视频做的一个 spring boot 的项目,包含了比较简单的记账功能的实现(只限 API 部分),具体实现的功能有: 记账(expen…...
Pell数列【一本通在线评测】
目录 描述 输入描述 输出描述 用例输入 1 用例输出 1 什么是pell数列 一、定义与递推关系 二、数学性质 三、应用领域 四、编程实现要点 五、扩展与相关概念 C代码实现 描述 Pell数列a1,a2,a3,...的定义是这样的,a11,a22,...,an2an−1a…...
linux ollama deepseek等大语言模型的model文件的存储目录
linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的,模型数据存放在: /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录,则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...
【PyQt】工具栏(QToolBar)与动作按钮(QAction)使用指南
PyQt工具栏(QToolBar)与动作按钮(QAction)使用指南 🛠️ 一、基础用法示例 🌟 class MainWindow(QMainWindow):def __init__(self):super().__init__()# 创建工具栏 🔧self.toolbar self.addToolBar("主工具栏")# 创建动作集合 …...
软路由折腾 | OpenWrt安装后基础配置指南:联网设置与DNS优化
在PVE中安装OpenWrt教程 一、网络基础配置 1. 确认网络接口角色 OpenWrt旁路由通常仅需配置LAN口,无需WAN口。其流量通过主路由转发,因此需确保: 物理连接:OpenWrt的LAN口(如eth0)桥接到主路由的局域网&…...
设置默认构建变体 Build Variant
Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…...
【大模型】DeepSeek使用与原理解析:从V3到R1
文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力ÿ…...
DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类
学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…...
oracle 19c安装DBRU补丁时报错CheckSystemSpace的处理
oracle 19c的补丁目前已经发布到19.26版本了,数据库补丁安装也是数据库运维中的一个常见工作;近期在一个安装补丁的环境遇到了Prerequisite check "CheckSystemSpace" failed.错误,看起来是磁盘剩余空间不足的告警;按以…...
图像生成GAN和风格迁移
文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…...
golangAPI调用deepseek
目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…...
【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】
一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…...
JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试
前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…...
LangChain大模型应用开发:提示词工程应用与实践
介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是LangChain提示词工程应用与实践。 在如今火热的大语言模型应用领域里,LangChain可是一个相当强大且实用的工具。而其中的提示词(Prompt),更是我们与语言模型进行有效沟通的关…...
【数据结构入门 65 题】目录
目录 1 函数题2 编程题3 数据结构实现 1 函数题 6-1 单链表逆转 6-2~6-6 线性表基本操作 6-7 在一个数组中实现两个堆栈 6-8 求二叉树高度 6-9 二叉树的遍历 6-10 二分查找 6-11 先序输出叶结点 6-12 二叉搜索树的操作集 2 编程题 3 数据结构实现 栈和队列...
osgearth控件显示中文(八)
当前自己知道的方法大概有以下两种: (一)直接转成utf8 其实在前面的文章中已经有了。 osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(GeoPoint(geoSRS, 110, 34), String2UTF8("中国"), style);std::wstring String2Wstring(con…...
2025 N1CTF crypto 复现
近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…...
