[ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。
本文同步于个人公众号:【云计算洞察】
更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。
本系列已更新博文:
- [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南
- [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
- [ 云计算 | AWS 实践 ] 使用 Java 列出存储桶中的所有 AWS S3 对象
- [ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象
- [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
- [ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中
文章目录
- 一、前言
- 二、所需 Maven 依赖
- 三、先决必要的几个条件信息
- 四、创建客户端连接
- 五、Amazon S3 存储桶操作
- 5.1. 创建桶
- 5.2. 列出桶
- 5.3. 删除桶
- 六、Amazon S3 对象操作
- 6.1. 上传对象
- 6.2. 列出对象
- 6.3. 下载对象
- 6.4. 复制、重命名和移动对象
- 6.5. 删除对象
- 6.6. 删除多个对象
- 七、文末总结
一、前言
在本文中,我们将探索如何利用 Java 编程与 Amazon S3(即简单存储服务)存储系统进行互动。
需要牢记,S3 的结构异常简单:每个存储桶能够容纳大量的对象,这些对象可以通过 SOAP 接口或 REST 风格的 API 进行访问。
接下来,我们将使用适用于Java的AWS开发工具包来实现S3存储桶的创建、列举以及删除。同时,我们还将学会如何上传、列举、下载、复制、移动、重命名以及删除这些存储桶内的各个对象。
二、所需 Maven 依赖
在开始之前,我们需要在项目中声明 AWS SDK 依赖项:
<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.20.52</version>
</dependency>
要查看最新版本,我们可以检查 Maven Central,或者其他的国内 Maven 仓库。
三、先决必要的几个条件信息
要使用AWS SDK,我们需要一些东西:
- AWS 帐户:我们需要一个 Amazon Web Services 帐户。如果我们没有,我们可以直接在 AWS 控制台创建一个帐户。
- AWS 安全凭证:这些是我们的访问密钥,允许我们以编程方式调用 AWS API 操作。我们可以通过两种方式获取这些凭证:使用“安全凭证”页面的访问密钥部分中的 AWS 根账户凭证,或者使用
IAM控制台中的 IAM 用户凭证。 - 选择 AWS 区域(Region):我们还必须选择要存储 Amazon S3 数据的 AWS 区域。请记住,S3 存储价格因地区而异。有关更多详细信息,请参阅官方文档。
四、创建客户端连接
首先,我们需要创建一个客户端连接来访问 Amazon S3 Web 服务。为此,我们将使用 Amazon S3 接口:
AWSCredentials credentials = new BasicAWSCredentials("<AWS accesskey>", "<AWS secretkey>"
);
然后我们将配置客户端:
AmazonS3 s3client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(Regions.US_EAST_2).build();
五、Amazon S3 存储桶操作
5.1. 创建桶
需要注意的是,存储桶命名空间是由系统的所有用户共享的。因此,我们的存储桶名称在 Amazon S3 中的所有现有存储桶名称中必须是唯一的(稍后我们将了解如何检查这一点)。
另外,根据官方文档规定,Bucket 名称必须符合以下要求:
- 名称不应包含下划线
- 名称长度应介于 3 到 63 个字符之间
- 名称不应以破折号结尾
- 名称不能包含相邻的句点
- 名称后面不能包含破折号(例如,“my-.bucket.com”和“my.-bucket”无效)
- 名称不能包含大写字符
现在让我们创建一个存储桶:
String bucketName = "baeldung-bucket";if(s3client.doesBucketExist(bucketName)) {LOG.info("Bucket name is not available."+ " Try again with a different Bucket name.");return;
}
CreateBucketRequest bucketRequest = CreateBucketRequest.builder().bucket(bucketName).build();s3Client.createBucket(bucketRequest);
在创建存储桶之前,我们必须使用doesBucketExist()方法检查存储桶名称是否可用。如果名称可用,那么我们将构建一个CreateBucketRequest 并提供存储桶名称。最后一步是将bucketRequest传递给 S3Client 的CreateBucketRequest createBucketRequest的createBucket。
5.2. 列出桶
现在我们已经创建了一些存储桶,让我们使用listBuckets ()方法打印 S3 环境中可用的所有存储桶的列表。此方法将返回一个ListBucketsResponse, 其中包含有关存储桶的信息。
ListBucketsResponse listBucketsResponse = s3Client.listBuckets();// Display the bucket names
List<Bucket> buckets = listBucketsResponse.buckets();
System.out.println("Buckets:");
for (Bucket bucket : buckets) {System.out.println(bucket.name());
}
这将列出 S3 环境中存在的所有存储桶:
baeldung-bucket
baeldung-bucket-test2
elasticbeanstalk-us-east-2
5.3. 删除桶
在删除存储桶之前,确保存储桶是空的非常重要。 否则,将会抛出异常。
首先,我们需要构建一个DeleBucketRequest实例并向其传递存储桶名称。然后,我们调用 s3Client 对象上的deleteBucket方法,并将请求作为参数传递。
另请注意,只有存储桶的所有者才能删除它,无论其权限如何(访问控制策略):
try {DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder().bucket(bucketName).build();s3Client.deleteBucket(deleteBucketRequest);System.out.println("Successfully deleted bucket : " + bucketName);
} catch (S3Exception e) {System.err.println(e.getMessage());System.exit(1);
}
六、Amazon S3 对象操作
Amazon S3 存储桶内的文件或数据集合称为对象。我们可以对对象执行多种操作,例如上传、列出、下载、复制、移动、重命名和删除。
6.1. 上传对象
上传对象是一个非常简单的过程。首先,我们将构建一个PutObjectRequest实例,指定存储桶名称和密钥。然后,我们将该请求和包含数据的文件的路径传递给 s3Client 的putObject方法:
PutObjectRequest request = PutObjectRequest.builder().bucket(bucketName).key(key).build();return s3Client.putObject(request, Path.of(file.toURI()) );
6.2. 列出对象
我们将使用listObjects()方法列出 S3 存储桶中的所有可用对象:
ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucketName).build();
ListObjectsV2Response listObjectsV2Response = s3Client.listObjectsV2(listObjectsV2Request);List<S3Object> contents = listObjectsV2Response.contents();System.out.println("Number of objects in the bucket: " + contents.stream().count());
contents.stream().forEach(System.out::println);
要列出 AWS S3 存储桶中的对象,我们需要创建一个ListObjectsV2Request实例并指定存储桶名称。然后,我们在 s3Client 对象上调用 listObjectsV2方法,并将请求作为参数传递。此方法返回一个ListObjectsV2Response,其中包含有关存储桶中对象的信息。
6.3. 下载对象
要下载对象,我们首先创建一个GetObjectRequest实例并将存储桶名称和密钥作为输入参数传递给它。然后,我们将其提供给 getObjectAsBytes()方法并获取响应。一旦我们得到响应,我们就可以提取字节数组。最后一步是处理字节数组:
GetObjectRequest objectRequest = GetObjectRequest.builder().bucket(bucketName).key(objectKey).build();ResponseBytes<GetObjectResponse> responseResponseBytes = s3Client.getObjectAsBytes(objectRequest);byte[] data = responseResponseBytes.asByteArray();// Write the data to a local file.
java.io.File myFile = new java.io.File("/Users/user/Desktop/hello.txt" );
OutputStream os = new FileOutputStream(myFile);
os.write(data);
System.out.println("Successfully obtained bytes from an S3 object");
os.close();
6.4. 复制、重命名和移动对象
我们可以通过调用 s3client 上的copyObject()方法来复制对象,该方法接受CopyObjectRequest实例。因此,CopyObjectRequest接受四个参数:
- 源存储桶名称
- 源存储桶中的对象键
- 目标存储桶名称(可以与源存储桶名称相同)
- 目标存储桶中的对象键
CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder().sourceBucket(sourceBucketName).sourceKey(sourceKey).destinationBucket(destinationBucketName).destinationKey(destinationKey).build();return s3Client.copyObject(copyObjectRequest);
注意:我们可以结合使用copyObject()方法和deleteObject()来执行移动和重命名任务。这将涉及首先复制对象,然后将其从旧位置删除。
6.5. 删除对象
要删除对象,我们将在s3client上调用deleteObject()方法并传递DeleteObjectRequest实例。为了创建DeleteObjectRequest实例,我们需要传递要删除的对象的键和存储桶名称:
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(objectKey).build();s3Client.deleteObject(deleteObjectRequest);
6.6. 删除多个对象
要一次删除多个对象,我们首先创建DeleteObjectsRequest对象并传递存储桶。然后我们将传递一个包含所有要删除的对象键的 ArrayList。
一旦我们有了这个DeleteObjectsRequest对象,我们就可以将它作为参数传递给我们的 s3client 的deleteObjects()方法。如果成功,它将删除我们提供的所有对象:
ArrayList<ObjectIdentifier> toDelete = new ArrayList<>();
for(String objKey : keys) {toDelete.add(ObjectIdentifier.builder().key(objKey).build());
}DeleteObjectsRequest deleteObjectRequest = DeleteObjectsRequest.builder().bucket(bucketName).delete(Delete.builder().objects(toDelete).build()).build();s3Client.deleteObjects(deleteObjectRequest);
七、文末总结
在本文中,我们重点介绍了在存储桶级别和对象级别与 Amazon S3 Web 服务交互的基础知识。重点在 Java 应用中使用 Amazon S3(Simple Storage Service)进行存储桶和对象操作的方法、详细说明了如何进行存储桶操作,包括创建桶和列出桶。在对象操作部分,我们涵盖了上传、列出和下载对象的过程,还介绍了复制、重命名、移动对象以及删除对象的方法。此外,我们还提供了删除多个对象的操作步骤。通过本文,小伙伴们可以了解如何通过 Java 代码有效地与 Amazon S3 进行交互,实现对存储桶和对象的各种操作。
[ 本文作者 ] bluetata
[ 原文链接 ] https://bluetata.blog.csdn.net/article/details/132531011
[ 最后更新 ] 11/19/2023 23:45
[ 版权声明 ] 如果您在非 CSDN 网站内看到这一行,
说明网络爬虫可能在本人还没有完整发布的时候就抓走了我的文章,
可能导致内容不完整,请去上述的原文链接查看原文。
相关文章:
[ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南
本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …...
循环单链表算法库
学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…...
WPS二次开发系列:Gradle版本、AGP插件与Java版本的对应关系
背景 最近有体验SDK的同学反馈接入SDK出现报错,最终定位到原因为接入的宿主app项目的gradle版本过低导致,SDK兼容支持了android11的特性,需要对应的gradle插件为支持android11的版本。 现象 解决方案 将gradle版本升级至支持android11的插件版…...
绿联 安装MariaDB数据库用于Seatable服务
绿联 安装MariaDB数据库用于Seatable服务 MariaDB MariaDB 是一个流行的开源关系型数据库管理系统(RDBMS),它是MySQL的一个分支,提供了丰富的功能和性能,适用于各种应用场景。 核心功能 SQL支持: MariaDB完全支持SQL&a…...
Spark, Storm, Flink简介
目录 1.Spark VS Storm2.Storm VS Flink 本文主要介绍Spark, Storm, Flink的区别。 1.Spark VS Storm Spark和Storm都是大数据处理框架,但它们在设计理念和使用场景上有一些区别: 实时性:Storm是一个实时计算框架,适合需要实时…...
【攻防世界】mfw(.git文件泄露)
首先进入题目环境,检查页面、页面源代码、以及URL: 发现页面无异常。 使用 dirsearch 扫描网站,检查是否存在可访问的文件或者文件泄露: 发现 可访问界面/templates/ 以及 .git文件泄露,故使用 GItHack 来查看泄露的 …...
递归神经网络(Recursive Neural Networks)
递归神经网络(Recursive Neural Networks)是一种特殊的神经网络,它们通过处理具有树形结构的数据来捕获数据的深层次关系,尤其是在自然语言处理和计算机视觉中的一些应用,如语法分析和场景理解。 1. 理解基本概念和背…...
【leetcode面试经典150题】29.三数之和(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例
ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例 文章目录 ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例一.Thinkphp5不安全的SQL写法二.Thinkphp3 SQL注入三.Thinkphp链5.1.x结合phar实现…...
Centos中一些有趣的命令
目录 1.sl 小火车 2. cowsay 会说话的牛 3.toilet/figlet 图形化输出 4.aafire 小火焰 5.linux_logo 显示系统logo 1.sl 小火车 yum install sl 2. cowsay 会说话的牛 yum install cowsay 3.toilet/figlet 图形化输出 yum install toilet yum install figlet 4.aafire 小火…...
elementUI2
ElementUI 图片引用查询表单表格展示新增修改详情图表 图片引用 <img :src"logo" width"100%" height"100%"/>import logoImg from /assets/logo/home.pngdata() {return {logo: logoImg,}}查询表单 <el-form :model"queryParams…...
Python 爬虫基础——http请求和http响应
写本篇文章,我认为是能把自己所理解的内容分享出来,说不定就有和我一样有这样思维的共同者,希望本篇文章能帮助大家!✨✨ 文章目录 一、 🌈python介绍和分析二、 🌈http请求三、 🌈http响应四、…...
【Hadoop】Hive导入导出数据指南
穿新衣吧 剪新发型呀 轻松一下Windows98 打扮漂亮 18岁是天堂 我们的生活甜得像糖 穿新衣吧 剪新发型呀 轻松一下Windows98 以后的路不再会有痛苦 我们的未来该有多酷 🎵 房东的猫《new boy》 Apache Hive 是一个基于Hadoop的数据仓库工具&…...
Mybatis 执行批量插入
首先,创建一个简单的 insert 语句: <insert id”insertname”>insert into names (name) values (#{value}) </insert>然后在 java 代码中像下面这样执行批处理插入: list < string > names new arraylist(); names.add(“fred”); names.add(“barney”)…...
vivado 使用基本触发器模式
使用基本触发器模式 基本触发器模式用于描述触发条件 , 即由参与其中的调试探针比较器组成的全局布尔公式。当“触发器模式 (Trigger Mode) ”设置为 BASIC_ONLY 或 BASIC_OR_TRIG_IN 时 , 即启用基本触发器模式。使用“基本触发器设置 (Basic Trig…...
Chrome 浏览器无法保存或自动填充密码
Chrome 浏览器无法保存或自动填充密码 分类 平时使用 Chrome 浏览器都会对网站的用户名密码自动填充,今天发现突然不行了,找到一个解决办法: 1、退出 Chrome 浏览器。2、打开 Chrome 安装目录下的的 Profile 目录,删除 Login Da…...
C语言面试指针辨析
1. const int *p int const *p p可以改变,*p不可以改变 p可以指向任意空间,但无法利用p修改指针空间的值 2. int *const p p不能改变,*p可以改变 3. const int *const p int const *const p p和*p都不能改变 4. 面试问题 将内存地址为0x2…...
YOLOV5 分类:利用yolov5进行图像分类
1、前言 之前介绍了yolov5的目标检测示例,这次将介绍yolov5的分类展示 目标检测:YOLOv5 项目:训练代码和参数详细介绍(train)_yolov5训练代码的详解-CSDN博客 yolov5和其他网络的性能对比 yolov5分类的代码部分在这 2、数据集准备 yolov5分类的数据集就是常规的摆放方式…...
Golang | Leetcode Golang题解之第16题最接近的三数之和
题目: 题解: func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…...
React添加到现有项目
1.检查现有项目的根目录下是否有package.json文件 如果没有,则在项目的根目录下初始化一个package.json配置文件 2.在根目录下安装react和react-dom依赖 npm install --save react react-dom react-scripts安装成功后,react、react-dom以及react-scr…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
