自学内容网 自学内容网

Spring Boot上传文件Amazon S3实现

Amazon S3(Simple Storage Service)是AWS提供的一个高可用、可扩展的对象存储服务,允许用户存储和检索任意数量的数据。它非常适合用于备份、存档、Web应用程序托管等场景。

S3桶(Bucket)概述

S3中的存储是通过(bucket)来组织和管理的。桶是存储对象(文件和元数据)的容器,每个桶的名称在整个S3系统中必须唯一,并且不能包含在另一个桶中。用户可以将数据上传到S3桶中,并通过唯一的对象键来访问这些数据。

S3桶的主要特点

  1. 全球可用性 S3是一个分布式存储系统,支持全球访问。用户可以选择在不同的AWS区域中创建S3桶,以满足数据存储的地理位置要求和法规遵从性。

  2. 无限存储 S3桶理论上没有容量限制。每个桶内可以存储任意数量的对象,但单个对象的大小最大限制为5TB。

  3. 数据一致性 S3提供写后读一致性,这意味着新上传的文件可以立即被读取。此外,S3也保证覆盖写的最终一致性。

  4. 权限管理 S3桶的访问权限可以通过以下几种方式进行控制:

    • IAM用户策略:可以为桶设置基于IAM(身份和访问管理)的用户或角色策略。
    • 桶策略:可以为桶定义策略,指定谁可以访问哪些文件。
    • ACL(访问控制列表):用于控制特定对象的访问权限。
  5. 数据安全性

    • 加密:S3支持在传输时和存储时的加密。用户可以选择服务器端加密(SSE),或者自行在客户端加密数据后上传。
    • 版本控制:启用版本控制后,S3会为每个文件保留不同版本的拷贝,即使文件被覆盖或删除,也能恢复以前的版本。
  6. 数据生命周期管理 可以为S3桶中的对象设置生命周期规则。例如,可以自动将文件从标准存储层迁移到成本更低的存档层(如Glacier),或者自动删除不再需要的数据。

  7. 存储类 S3提供了多种存储类,用户可以根据访问频率、数据持久性需求等选择合适的存储类:

    • S3标准(Standard):用于高频访问的数据。
    • S3智能分层(Intelligent-Tiering):自动将数据在不同访问层级之间移动,以优化成本。
    • S3标准-IA(Infrequent Access):用于不经常访问但需要快速恢复的数据。
    • S3 Glacier:用于长期存档数据,检索时间较长。
    • S3 One Zone-IA:用于不常访问且无需跨区域冗余的数据。

S3桶的应用场景

  1. 静态网站托管 S3桶可以配置为静态网站托管服务,特别适合于托管HTML、CSS、JavaScript等前端资源。用户可以通过分配域名将网站部署到S3上。

  2. 数据备份与恢复 S3常用于备份文件、数据库等重要数据,并提供持久性高的数据存储,适合长时间保存和归档。

  3. 大数据分析与处理 S3与其他AWS服务(如EMR、Athena等)无缝集成,可以存储、处理和分析海量数据。

  4. 媒体文件存储 S3适合存储和分发图片、视频等媒体文件,它的高可用性和全球访问能力确保文件的快速分发。

  5. 数据归档 使用S3 Glacier等存储类,用户可以将不常访问但需要长期保存的数据归档到低成本存储层。

S3桶的操作

常见的S3桶操作包括:

  • 创建桶:定义唯一名称和区域。
  • 上传对象:可以通过AWS管理控制台、命令行工具(CLI)、SDK或API上传文件。
  • 设置权限:通过桶策略、ACL、IAM控制谁可以访问桶及其内容。
  • 下载和删除对象:对象可以随时下载或删除,支持大文件分块上传和多版本控制。

费用

S3的费用主要根据以下几方面计算:

  1. 存储量:按每月存储的数据量计费。
  2. 请求与数据检索:不同的请求操作(如PUT、GET)以及数据从S3中检索的流量也会产生费用。
  3. 数据传输:跨区域或从AWS外部传输数据时,可能产生额外的带宽费用。

总结,Amazon S3桶是一个灵活、高可用且安全的对象存储服务,适用于各种数据存储和访问需求。

1、引用Maven依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.12.761</version>
</dependency>

2、YAML配置

aws:
  accessKey: your-access-key-id
  secretKey: your-secret-access-key
  baseUrl: https://www.test.com/
  s3:
    bucketName: test-test-public
    localRecord:
      region: sa-test-1

3、配置类

/**
 * @author Lucas
 * date 2024/10/10 18:52
 * description 配置AWS S3 对应bean
 */
@Configuration
public class AwsConfiguration {

    @Value("${aws.accessKey}")
    private String accessKey;

    @Value("${aws.secretKey}")
    private String secretKey;

    @Getter
    @Value("${aws.s3.bucketName}")
    private String bucketName;

    @Value("${aws.s3.localRecord.region}")
    private String localRecordRegion;

    @Getter
    @Value("${aws.baseUrl}")
    private String baseUrl;

    @Bean
    public AmazonS3 s3Client() {
        BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder.standard()
                .withRegion(localRecordRegion)
                .withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
                .build();
    }
}

4、S3Controller接口类

/**
 * @author Lucas
 * date 2024/8/2 12:05
 * description S3桶上传文件
 */
@RestController
@Slf4j
public class CommonS3Controller {

    @Resource
    private AmazonS3 s3Client;

    @Resource
    private AwsConfiguration awsConfiguration;
    
    /**
     * 通用上传请求(单个)
     */
    @PostMapping("/uploadS3")
    @ResponseBody
    public CommonResult uploadFileToS3(MultipartFile file) throws Exception {
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(file.getSize());
        metadata.setContentType(file.getContentType());
        String fileKey = "TEST" + UUID.randomUUID();
        PutObjectRequest request = new PutObjectRequest(awsConfiguration.getBucketName(), fileKey, file.getInputStream(), metadata);
        s3Client.putObject(request);
        return CommonResult.success(awsConfiguration.getBaseUrl() + fileKey);
    }


    /**
     * 通用上传请求(多个)
     */
    @PostMapping("/uploadsS3")
    @ResponseBody
    public CommonResult uploadFilesToS3(List<MultipartFile> files) throws Exception {
        List<String> urls = new ArrayList<>();
        for (MultipartFile file : files) {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            String fileKey = "TEST" + UUID.randomUUID();
            PutObjectRequest request = new PutObjectRequest(awsConfiguration.getBucketName(), fileKey, file.getInputStream(), metadata);
            s3Client.putObject(request);
            urls.add(awsConfiguration.getBaseUrl() + fileKey);
        }
        return CommonResult.success(urls);
    }
}


原文地址:https://blog.csdn.net/Demon_Hao/article/details/142829457

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!