当前位置: 代码网 > it编程>编程语言>Java > SpringBoot对接AWS S3实现上传和查询

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

2025年02月17日 Java 我要评论
1.aws s3介绍aws s3(amazon simple storage service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是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的资料请关注代码网其它相关文章!

(0)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com