Amazon S3 文件上传工具(SDK V2)

背景描述

前段时间接触到公司使用了Amazon S3协议的文件管理系统,以前从来没接触过Amazon的东西,文档大部分是英文机翻,极不友好。凭借着自己蹩脚的英语水平,跌跌撞撞摸索明白了一些。百度上有一些大佬分享了自己的博客是关于Amazon S3文件上传系统的小工具,但是他们的SDK版本是V1的,和我们的不匹配,无法使用。

官方文档

官方有一些示例demo可以看,但是路径比较难找,分享一下链接https://docs.aws.amazon.com/zh_cn/code-samples/latest/catalog/code-catalog-javav2-example_code-s3.html

封装工具

1. 导入maven依赖

此处只展示Amazon S3需要的两个依赖,其余的Spring依赖根据自己需要再导入

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.16.60</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

	<dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

2. 编写工具类

详细的设置看注释

package com.utils;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.model.*;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;

@Component
public class S3Util {
    private static String uri;
    private static String bucket;

	// application.yml 配置文件的配置
    @Value("${s3.uri}")
    public static void setUri(String uri) {
        S3Util.uri = uri;
    }
    // application.yml 配置文件的配置
    @Value("${s3.bucket}")
    public static void setBucket(String bucket) {
        S3Util.bucket = bucket;
    }

    public static S3Client init() throws URISyntaxException {
        Region region = Region.US_EAST_1;
        S3Configuration s3Config = S3Configuration.builder().pathStyleAccessEnabled(true).build();
        URI uriObj = new URI(uri);
        S3Client s3 = S3Client.builder().serviceConfiguration(s3Config).region(region).endpointOverride(uriObj).build();
        return s3;
    }

    public static String putS3Object (S3Client s3, String fileName, MultipartFile file, String contentType) {
        String strs[] = fileName.split("\\.");
        String keyName = strs[0] + System.currentTimeMillis() + "." + strs[1];
        try {
            PutObjectRequest putOb = PutObjectRequest.builder().bucket(bucket).key(keyName).contentType(contentType).build();
            s3.putObject(putOb, RequestBody.fromBytes(file.getBytes()));
            return "/" + bucket + "/" + keyName;
        } catch (S3Exception | IOException e) {
            System.err.println(e.getMessage());
        }
        return "";
    }

    public static void getURL(S3Client s3, String keyName) {
        try {
            GetUrlRequest request = GetUrlRequest.builder().bucket(bucket).key(keyName).build();
            URL url = s3.utilities().getUrl(request);
            System.out.println("The URL for " + keyName + " is" + url);
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
    }

    public static void deleteBucketObjects(S3Client s3, String objectName) {
        ArrayList<ObjectIdentifier> toDelete = new ArrayList<>();
        toDelete.add(ObjectIdentifier.builder().key(objectName).build());
        try {
            DeleteObjectsRequest dor = DeleteObjectsRequest.builder().bucket(bucket).delete(Delete.builder().objects(toDelete).build()).build();
            s3.deleteObjects(dor);
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
        System.out.println("Done!");
    }
}



3. 使用方式

S3Client s3 = S3Util.init();
String path = S3Util.putS3Object(s3, fileName, file, contentType);
s3.close();

可能有些同学很不理解,这个contentType为什么要自己去设置,默认的不行吗?还真不行,默认的contentType为文件形式,会触发浏览器的下载事件,但是一般会使用S3协议的需求,都是希望能通过链接直接能打开图片、或者视频,无需其它的操作。
如果你不知道这个该怎么设置,可以参看一下开源中国的在线工具

总结

要配置的东西不多,基本上拿来即用。工具也很简陋,也有升级的空间。参看这个可能未能满足你心中的那种完美工具的标杆,但也能给你一点思路去摸索。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用Java语言实现批量上传文件到AWS S3存储的示例代码: ```java import java.io.File; import java.util.List; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.PutObjectRequest; public class S3Util { private static final String S3_ENDPOINT = "your-s3-endpoint-url"; private static final String S3_REGION = "your-s3-region"; private static final String S3_ACCESS_KEY = "your-s3-access-key"; private static final String S3_SECRET_KEY = "your-s3-secret-key"; private static final String S3_BUCKET_NAME = "your-s3-bucket-name"; public static void uploadFiles(List<File> files) { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(S3_ENDPOINT, S3_REGION)) .withCredentials(new DefaultAWSCredentialsProviderChain()) .build(); try { for (File file : files) { String key = file.getName(); PutObjectRequest request = new PutObjectRequest(S3_BUCKET_NAME, key, file); s3Client.putObject(request); } } catch (AmazonServiceException e) { e.printStackTrace(); } catch (SdkClientException e) { e.printStackTrace(); } } } ``` 使用时,只需传入需要上传的文件列表即可: ```java List<File> files = new ArrayList<>(); files.add(new File("file1")); files.add(new File("file2")); S3Util.uploadFiles(files); ``` 在上述代码中,我们使用了AWS SDK的`AmazonS3`客户端,通过`withEndpointConfiguration`方法设置S3的Endpoint URL和Region,`withCredentials`方法设置S3的Access Key和Secret Key,`build`方法创建S3客户端。在上传文件时,我们使用了`PutObjectRequest`对象,其中包含了需要上传的文件、存储桶名称和对象名称,通过`putObject`方法将文件上传S3存储中。 希望对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值