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(身份与访问管理)

  1. 在控制台主页,找到并点击"IAM"服务。
  2. 在左侧菜单中,选择"用户"。

2.3. 创建新用户(如果需要)

如果你还没有用户,或者想为特定的应用创建一个新用户,可以按照以下步骤创建:

  1. 点击"添加用户"。
  2. 输入用户名,并选择"编程访问"选项。
  3. 点击"下一步:权限"。

2.4. 设置权限

  1. 你可以选择将用户添加到现有的用户组,或者直接为用户附加权限策略。

  2. 如果你只需要S3的访问权限,可以选择"创建策略",并使用以下JSON示例来创建一个只允许访问S3的策略:

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } }

  3. 完成后,点击"下一步:标签",然后点击"下一步:查看"。

  4. 确认信息无误后,点击"创建用户"。

2.5. 获取访问密钥和秘密密钥

  1. 创建用户后,你将看到一个成功页面,其中包含"访问密钥 ID"和"秘密访问密钥"。
  2. 注意:秘密访问密钥只会在此时显示一次,请务必将其安全保存。如果丢失,你需要重新生成密钥。

2.6. 配置密钥

将获取到的"访问密钥 ID"和"秘密访问密钥"填入你的application.properties文件中:

ini 复制代码
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 复制代码
<?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的示例:

ini 复制代码
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客户端:

kotlin 复制代码
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. 实现文件上传和查询功能

创建一个服务类来处理文件的上传和查询:

java 复制代码
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请求:

kotlin 复制代码
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);
    }
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

4. 测试

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

上传文件:

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

查询文件:

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

注意事项

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

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

5.引用

相关推荐
葫芦和十三25 分钟前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp1 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑1 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯2 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan4 小时前
多Agent之间的区别
后端
青石路6 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充7 小时前
1.面向对象设计思想
后端
IT_陈寒7 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro7 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗8 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端