SpringBoot对接AWS S3实现上传和查询

 更新时间:2025年02月17日 10:19:25   作者:HBLOG  
AWS S3是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案,本文我们就来看看SpringBoot如何对接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;

    @Bean
    public 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 {

    @Autowired
    private 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 {

    @Autowired
    private 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.com/Harries/springboot-demo(aws-s3)

4. 测试

启动你的Spring Boot应用,并使用Postman或其他工具测试文件上传和查询功能。

上传文件

发送POST请求到/api/s3/upload,并在请求中附加文件。

查询文件

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

注意事项

  • 确保你的AWS IAM用户具有对S3的访问权限。
  • 根据需要处理异常和错误情况。
  • 你可以根据需要扩展功能,例如文件删除、文件下载等。

通过以上步骤,你就可以在Spring Boot应用中成功对接AWS S3服务,实现文件的上传和查询。

以上就是SpringBoot对接AWS S3实现上传和查询的详细内容,更多关于SpringBoot AWS S3的资料请关注脚本之家其它相关文章!

相关文章

  • mybatis定义sql语句标签之delete标签解析

    mybatis定义sql语句标签之delete标签解析

    这篇文章主要介绍了mybatis定义sql语句标签之delete标签解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中的@Conditional条件注解详细解析

    Java中的@Conditional条件注解详细解析

    这篇文章主要介绍了Java中的@Conditional条件注解详细解析,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,需要的朋友可以参考下
    2023-11-11
  • java实体对象与Map之间的转换工具类代码实例

    java实体对象与Map之间的转换工具类代码实例

    这篇文章主要介绍了java实体对象与Map之间的转换工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Jmeter参数化实现原理及过程解析

    Jmeter参数化实现原理及过程解析

    这篇文章主要介绍了Jmeter参数化实现原理及过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java代码审计的一些基础知识你知道吗

    Java代码审计的一些基础知识你知道吗

    这篇文章主要介绍了基于Java的代码审计功能的基础知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • Java基础之重载(Overload)与重写(Override)详解

    Java基础之重载(Overload)与重写(Override)详解

    这篇文章主要介绍了Java基础之重载(Overload)与重写(Override)详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • springboot-dubbo cannot be cast to问题及解决

    springboot-dubbo cannot be cast to问题及解决

    这篇文章主要介绍了springboot-dubbo cannot be cast to问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java 在Word中创建邮件合并模板并合并文本和图片的操作方法

    Java 在Word中创建邮件合并模板并合并文本和图片的操作方法

    通过Java程序展示如何来实现创建模板,并通过邮件合并功能来合并文本数据和图片数据的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • java数据结构基础:栈

    java数据结构基础:栈

    这篇文章主要介绍了Java的数据解构基础,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • MyBatis中SQL片段复用使用方法详解

    MyBatis中SQL片段复用使用方法详解

    在使用 MyBatis 进行数据库操作时,常常会遇到一些 SQL 语句的部分内容重复出现的情况,比如多个查询语句都涉及相同的字段列表,这时,MyBatis 的 SQL 片段复用功能就派上用场了,接下小编给大家介绍了MyBatis中SQL片段复用使用方法,需要的朋友可以参考下
    2024-12-12

最新评论