Java 实现上传下载文件 AWS S3

步骤一、AWS S3云端配置

1.首先创建AWS账号

2.创建访问密钥

登录进去点击右上角自己的账户名,然后依次选择:安全凭证-》访问密钥-》创建访问密钥-》已完成。

注意:复制创建的访问密钥(access key)和秘密访问密钥 (secret access key),一定要复制这个秘密访问密钥,点击“已完成”之后就看不到这个秘密访问密钥了。

3.使用S3创建存储桶

找到S3服务:Amazon S3-》存储桶-》创建存储桶

注意:1.创建桶的区域,是可以更改的,有时候有的区域网络不好,可以多尝试创建不同区域的桶测试;2.启用ACL; 3.不选择“阻止所有公开访问”

二、JAVA本地开发

开发工具:IDEA

软件开发工具包: jdk 1.8

项目管理和构建自动化工具: Maven

1.创建项目并在pom文件中添加AWS 2.x 的相关依赖。注意:此处是AWS SDK for Java, version 2

!--引入AWS 2.x 的sdk-->
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.16.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>dynamodb</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
    </dependencies>

2.编写代码,测试对存储桶进行文件上传下载遍历测试

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseInputStream;
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.model.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class AWScrudtest {
    private static final String accessKeyId = "你的访问密钥";
    private static final String secretAccessKey = "你的访问秘密密钥";
    private static final String region = "你创建的桶的所在区域"; // 根据实际情况设置
    private static final String bucketName = "你的桶的名字";
    private static S3Client s3Client;

    // 设置认证信息
    static {
        AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKeyId, secretAccessKey);
        s3Client = S3Client.builder()
                .region(Region.of(region)) // 根据实际情况设置 region
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();
    }

    /**
     * 上传文件
     *
     * @param bucketName
     * @param keyName
     * @param file
     */
    public static void uploadObject(String bucketName, String keyName, File file) {
        try {
            s3Client.putObject(PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName) //文件在存储桶中的名字
                    .build(), RequestBody.fromFile(file));
            System.out.println("Object '" + keyName + "' uploaded to bucket '" + bucketName + "' successfully.");
        } catch (S3Exception e) {
            System.err.println("Error uploading object: " + e.getMessage());
        }
    }

    // 遍历存储桶中的对象
    public static void traverseBucket(String bucketName) {
        try {
            // 构建请求对象
            ListObjectsV2Request request = ListObjectsV2Request.builder()
                    .bucket(bucketName)
                    .build();

            ListObjectsV2Response response;
            do {
                // 获取存储桶中的对象
                response = s3Client.listObjectsV2(request);
                // 遍历对象
                for (S3Object s3Object : response.contents()) {
                    System.out.println("Object Key: " + s3Object.key() + " | Size: " + s3Object.size());
                }
                // 如果响应中有更多的对象,获取下一个页面
                request = request.toBuilder()
                        .continuationToken(response.nextContinuationToken())
                        .build();
            } while (response.isTruncated()); // 处理分页

        } catch (Exception e) {
            System.err.println("Error traversing bucket: " + e.getMessage());
        }
    }

    //下载桶中的对象
    public static void downloadObject(String bucketName, String keyName, String downloadFilePath) {
        try {
            GetObjectRequest getObjectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();

            ResponseInputStream<?> responseInputStream = s3Client.getObject(getObjectRequest);
            FileOutputStream fileOutputStream = new FileOutputStream(downloadFilePath);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = responseInputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Object '" + keyName + "' downloaded from bucket '" + bucketName + "' to '" + downloadFilePath + "' successfully.");

            fileOutputStream.close();
            responseInputStream.close();

        } catch (IOException e) {
            System.err.println("Error downloading object: " + e.getMessage());
        } catch (S3Exception e) {
            System.err.println("Error downloading object: " + e.getMessage());
        }
    }

    //删除桶中的对象
    public static void deleteObject(String bucketName, String keyName) {
        try {
            s3Client.deleteObject(DeleteObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build());
            System.out.println("Object '" + keyName + "' deleted from bucket '" + bucketName + "' successfully.");
        } catch (S3Exception e) {
            System.err.println("Error deleting object: " + e.getMessage());
        }
    }


    public static void main(String[] args) {
        uploadObject(bucketName,"test01",new File("D:\\人.png"));
        traverseBucket(bucketName);
        downloadObject(bucketName, "test01", "D:\\人1.png");
        deleteObject(bucketName, "test01");
    }


}

参考:

AWS SDK开发官方文档:将此服务与 AWS SDK 结合使用 - Amazon Simple Storage Service

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值