Amazon S3 的 java sdk简单使用

Amazon S3 的 java sdk简单使用对于 amazons3 的 javasdk 简单使用

Amazon S3 的 java sdk简单使用

在开发过程中基本都需要使用到对象存储技术。

对于一些国内的项目来说,可以使用阿里云,七牛云,京东云等开发平台进行开发对接存储对象。

而对于海外的项目,可能现有的国内技术无法使用,这时候就遇到了amazon这个平台了。在此只整理了其对接以及对象存储和验签预览对象的功能。

以下使用的是AWS SDK for Java2.x的开发工具包

详细使用请看:https://github.com/aws/aws-sdk-java-v2/#using-the-sdk

一、项目依赖导入

maven依赖管理

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk 
     groupId> <artifactId>bom 
      artifactId> <version>2.17.100 
       version> <type>pom 
        type> <scope>import 
         scope>  
          dependency>  
           dependencies>  
            dependencyManagement> 

选择需要的模块进行依赖

<dependencies>  
    <dependency> <groupId>software.amazon.awssdk 
     groupId> <artifactId>s3 
      artifactId>  
       dependency> <dependency> <groupId>software.amazon.awssdk 
        groupId> <artifactId>kms 
         artifactId>  
          dependency> <dependency> <groupId>software.amazon.awssdk 
           groupId> <artifactId>s3control 
            artifactId>  
             dependency>  
              dependencies> 

整个SDK包(不建议使用此方式导入,有大量的不需要的模块):

<dependency> <groupId>software.amazon.awssdk 
     groupId> <artifactId>aws-sdk-java 
      artifactId> <version>2.17.100 
       version>  
        dependency> 

二、配置添加

nacos:

aws: s3: accessKey: xxxxxxxxxx secretKey: xxxxxxxxxx region: us-east-2 (选择s3控制台上的资源区域) bucket: xxx 

配置类读取nacos的配置:

/ * @author Survivor * @create 2021/12/20 17:49 */ @Configuration public class AwsConfiguration { 
    @Value("${aws.s3.accessKey}") private String accessKey; @Value("${aws.s3.secretKey}") private String secretKey; @Value("${aws.s3.region}") private String region; @Value("${aws.s3.bucket}") private String bucket; @Bean public void initAwConfiguration() { 
    AwsUtils.setAccessKey(accessKey); AwsUtils.setSecretKey(secretKey); AwsUtils.setRegion(region); AwsUtils.setBucket(bucket); } } 

获取配置:

/ * @author Survivor * @create 2021/12/20 17:48 */ @Slf4j public class AwsUtils { 
    private static String accessKey; private static String secretKey; private static String region; // bucket private static String bucket; public static void setAccessKey(String accessKey) { 
    AwsUtils.accessKey = accessKey; } public static void setSecretKey(String secretKey) { 
    AwsUtils.secretKey = secretKey; } public static void setBucket(String bucket) { 
    AwsUtils.bucket = bucket; } public static void setRegion(String region) { 
    AwsUtils.region = region; } } 

三、使用aws的s3 SDK

  1. 获取s3对象
/ * 获取S3Client对象 * * @return s3 */ private static S3Client getAmazonS3() { 
    return S3Client.builder() .credentialsProvider(getAwsCredentialsProviderChain()) .region(Region.of(region)) .build(); } // 获取aws供应商凭据 private static AwsCredentialsProviderChain getAwsCredentialsProviderChain(){ 
    return AwsCredentialsProviderChain .builder() .addCredentialsProvider(new AwsCredentialsProvider() { 
    @Override public AwsCredentials resolveCredentials() { 
    return AwsBasicCredentials.create(accessKey, secretKey); } }).build(); } 
  1. 对象存储
private static String putS3Object(S3Client s3, String bucketName, String objectKey, String objectPath) { 
    try { 
    String mimetype = Mimetypes.getInstance().getMimetype(new File(objectPath)); PutObjectRequest putOb = PutObjectRequest.builder() .bucket(bucketName) .key(objectKey) .contentType(mimetype) .build(); PutObjectResponse response = s3.putObject(putOb, RequestBody.fromBytes(getObjectFile(objectPath))); return response.eTag(); } catch (S3Exception e) { 
    System.err.println(e.getMessage()); System.exit(1); } return ""; } private static byte[] getObjectFile(String filePath) { 
    FileInputStream fileInputStream = null; byte[] bytesArray = null; try { 
    File file = new File(filePath); bytesArray = new byte[(int) file.length()]; fileInputStream = new FileInputStream(file); fileInputStream.read(bytesArray); } catch (IOException e) { 
    e.printStackTrace(); } finally { 
    if (fileInputStream != null) { 
    try { 
    fileInputStream.close(); } catch (IOException e) { 
    e.printStackTrace(); } } } return bytesArray; } 

​ putS3Object()方法返回的字符串信息,就是上传后的存储key,如果你的存储的bucket不是私有的,可以直接拼接域名,直接访问bucket上的对象。但如果你的bucket是私有的,又想要访问其对象的话,就需要用到下面的验签获取:

对象获取

private static S3Presigner getS3Presigner() { 
    return S3Presigner.builder() .region(Region.of(region)) .credentialsProvider(getAwsCredentialsProviderChain()) .build(); } / * 预览 有效时间为1小时 * * @param key * @return */ private static String preview(String bucketName, String key) { 
    GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(key) .build(); GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(60)) .getObjectRequest(getObjectRequest) .build(); PresignedGetObjectRequest presignedGetObjectRequest = getS3Presigner().presignGetObject(getObjectPresignRequest); return presignedGetObjectRequest.url().toString(); } 

得到的是一串加上了验签参数的url路径,得到这个路径后就可以直接访问了。

这边只整理了小部分功能,其余的功能有需要的可以参考官方代码示例:https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/s3/src/main/java/com/example/s3

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179301.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午3:54
下一篇 2026年3月26日 下午3:55


相关推荐

  • MySQL主从复制配置[通俗易懂]

    MySQL主从复制配置[通俗易懂]MySQL主从复制及读写分离一、MySQL复制的应用常见场景 读写分离,提高查询访问性能,有效减少主数据库访问压力。 实时灾备,主数据库出现故障时,可快速切换到从数据库。 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。 二、MySQL主从复制原理介绍1、MySQL异步和半同步复制传统的MySQL复制提供了一种简单的主-从复制方法。有一个主,以及一个或多个从。主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新…

    2022年8月13日
    7
  • 微信小程序上线发布流程

    微信小程序上线发布流程最近花了一天左右的时间学习了下微信小程序的开发 试着练习一把的心态 搞了一个很简单的页面 就当是学习总结吧 学习要点还是挺多的 通过查看官方接口文档 熟悉微信小程序开发工具 工程架构 相比传统页面开发类似 微信小程序也是由 js 文件 页面布局文件 wxml 和样式文件 wxss 一 先登录微信公众平台 在小程序栏目里注册获取 appid 在开发工具里填写该 appid 打开开发工具进行编码工作

    2026年3月17日
    2
  • Oracle 报错ORA-00904: 标识符无效 ,但是列名和表名没有写错,怎么解决?

    Oracle 报错ORA-00904: 标识符无效 ,但是列名和表名没有写错,怎么解决?一般情况一般情况下 标识符错误是因为 语句中的列名在表中不存在 修改 sql 语句或者修改列名即可 特殊情况一般情况下 建表语句如下 createtables idint namevarchar2 100 但是如果建表语句写成了 createtables id int

    2026年3月18日
    2
  • a memorable day_the origin of mid autumn

    a memorable day_the origin of mid autumn(Verb)Pronunciation:[kê-‘lêm-nee-eyt]Definition:Tomakemaliciousstatementsknowntobefalseinaneffortto…

    2025年5月23日
    5
  • 编hadoop-1.X源代码

    编hadoop-1.X源代码

    2022年1月11日
    52
  • pytest parametrize fixture_参数化方法

    pytest parametrize fixture_参数化方法前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月31日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号