百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

spring boot 对接aws 的S3 服务,实现上传和查询

wptr33 2025-04-09 21:28 19 浏览

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": "*"
        }
    ]
}
  1. 完成后,点击“下一步:标签”,然后点击“下一步:查看”。
  2. 确认信息无误后,点击“创建用户”。

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

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

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的依赖:



    
        springboot-demo
        com.et
        1.0-SNAPSHOT
    
    4.0.0

    aws-s3

    
        8
        8
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-autoconfigure
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.amazonaws
            aws-java-sdk-s3
            1.12.300 
        
    

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 listFiles() {
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        List 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 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> listFiles() {
        List files = s3Service.listFiles();
        return ResponseEntity.ok(files);
    }
}

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

代码仓库

  • https://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服务,实现文件的上传和查询。

5.引用

  • https://aws.amazon.com/
  • https://docs.aws.amazon.com/s3/?icmpid=docs_homepage_featuredsvcs
  • https://www.liuhaihua.cn/archives/712143.html

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...