JAVA 整合 亚马逊AWS S3(文件上传,文件下载等)

JAVA 整合 亚马逊AWS S3(文件上传,文件下载)

1.添加依赖

因为aws需要发送请求上传、下载等api,所以需要加上httpclient相关的依赖

		<dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>1.12.198</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3-transfer-manager</artifactId>
            <version>2.20.26</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>kms</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3control</artifactId>
        </dependency>

2.配置AWS S3相关的信息

package com.ezfos.common.s3.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "aws.s3")
public class AwzS3Config {
    // 访问密钥
    private String accessKey;
    // 秘密密钥
    private String secretKey;
    // 存储桶名称
    private String bucket;
    // 区域
    private String region;
    // 前缀
    private String prefix;
}

3.创建一个S3Client对象

S3Client是Amazon Web Services(AWS)的SDK中的一个类,用于与Amazon S3服务进行交互。该方法使用了@Bean注解,表示它是一个Spring框架中的Bean定义,可以被其他组件注入使用。在方法内部,

首先通过AwsBasicCredentials.create()方法创建了一个AwsBasicCredentials对象,该对象包含了访问AWS所需的凭证信息,包括访问密钥和秘密密钥。

然后,使用S3Client.builder()方法创建了一个S3Client对象的构建器,并设置了以下配置:

  • region(Region.of(awzS3Config.getRegion())):设置AWS的区域信息,从awzS3Config对象中获取区域值。
  • credentialsProvider(StaticCredentialsProvider.create(awsCreds)):设置凭证提供者,使用前面创建的AwsBasicCredentials对象作为凭证。

最后,调用build()方法构建并返回一个S3Client对象。

请注意,代码中有一行被注释掉的代码:endpointOverride(URI.create("https://xxxxx(桶名).s3.cn-northwest-1.amazonaws.com"))。这行代码用于指定自定义的S3端点URL,如果需要使用自定义的S3端点,可以取消注释并修改为正确的URL。

package com.ezfos.common.s3.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

import javax.annotation.Resource;

@Component
@Configuration
public class S3Config {
    @Resource
    private AwzS3Config awzS3Config;
    @Bean
    public S3Client s3client() {
        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(awzS3Config.getAccessKey(), awzS3Config.getSecretKey());
        S3Client s3Client = S3Client.builder().
                region(Region.of(awzS3Config.getRegion())).
                credentialsProvider(StaticCredentialsProvider.create(awsCreds)).build();
//                endpointOverride(URI.create("https://xxxxx(桶名).s3.cn-northwest-1.amazonaws.com")).build();
        return s3Client;
    }
}

4.实现上传文件

 /**
     * 上传文件
     *
     * @param file
     * @param uploadKey
     * @return
     */
    public boolean uploadToS3(MultipartFile file, String uploadKey) {
   
        try {
   
            if (file == null) {
   
                return false;
            }
            //添加文件夹dev(文件夹其实就是一个前缀)
            String prefix = awzS3Config.getPrefix();
            String folderKey = prefix.concat(uploadKey);
            PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(awzS3Config.getBucket()).key(folderKey).contentType(file.getContentType()).build();
            s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes()));
            return true;
        } catch (S3Exception | IOException e) {
   
            e.printStackTrace();
            return false;
        }
    }

5.实现下载文件

    /**
     * 下载文件
     *
     * @param response
     * @param downloadKey
     * @return
     * @throws IOException
     */
    public HttpServletResponse downloadFromS3(HttpServletResponse response, String downloadKey, String fileName) throws IOException {
   
        // S3上存储的key
        String keyName = awzS3Config.getPrefix().concat(downloadKey);
        GetObjectRequest objectRequest = GetObjectRequest
                .builder()
                .key(keyName)
                .bucket(awzS3Config.getBucket())
                .build();
        InputStream inputStream = null;
        InputStream fis = null;
        try {
   
            ResponseBytes<GetObjectResponse> objectBytes = s3Client.getObjectAsBytes(objectRequest);
            inputStream = objectBytes.asInputStream();
            // 取得文件的后缀名。
            // 以流的形式下载文件。
            fis = new BufferedInputStream(inputStream);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种高度可扩展的对象存储服务。S3允许用户以云存储方式存储和检索任意数量的数据。以下是关于AWS S3的一些重要特性: 1. 可扩展性:AWS S3提供了高度可扩展的存储解决方案,能够适应任意规模的需求。无论是存储几个G的个人文件还是处理TB级别的数据,S3都能够满足需求。 2. 安全性:AWS S3提供多层次的安全控制来保护数据的完整性和安全性。用户可以通过控制访问权限来限制对存储桶和对象的访问。此外,S3还提供了加密功能,可以对数据进行加密,确保数据在传输和存储过程中的安全。 3. 可靠性:AWS S3采用了多副本存储和自动修复机制,确保数据的可用性和持久性。S3将数据存储在多个设备和多个区域,并且自动处理设备故障,以确保数据不会丢失。 4. 数据访问:通过AWS S3,用户可以轻松地在任何地方访问其存储的数据。S3提供了REST和SOAP接口,可以通过编程方式进行高效、低延迟的数据访问。此外,S3还提供了网页界面,方便用户直接通过浏览器进行数据管理和操作。 5. 成本效益:AWS S3采用按需计费模式,根据用户实际存储的数据量和数据传输的流量进行计费。用户只需支付实际使用的存储空间和传输流量,无需提前购买硬件设备或维护硬件设备,从而节约了成本。 总之,AWS S3是一种可靠、安全、高度可扩展的云存储解决方案。通过提供灵活的数据管理和访问方式,以及强大的安全控制和可靠性,S3帮助用户轻松地存储和管理各种类型的数据,并实现数据的安全性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值