Amazon S3 API操作示例-java版

     amazon (S3) 是一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档等。除去aws本身的服务可以将一些内容直接存储到s3桶之外 ,在很多情况下,还需要使用s3桶和外部服务进行交互,比如下面一些场景:

  • 场景一:配置使用aws服务产生的账单费用以文件的形式定期发送到s3桶,本地服务获取这些文件,生成新的账单或进行费用监控。
  • 场景二:配置使用aws服务产生的日志文件定期发送到s3桶,本地服务获取这些文件,做数据分析,预防风险。
  • 场景三:将s3桶当做无限量永久文件存储器,定期将文件上传到s3桶。

     无论哪种场景,使用控制台手动同步这些文件显然不是明智的选择,那么就需要用到Amazon提供的各种API来实现这些操作。下面是使用java对s3桶操作的一些示例,需要的小伙伴可以使用cv大法啦。
     首先引入java版的sdk。如果是本地开发,一般可以只引入aws-java-sdk一个jar包,它包含了所有aws服务的包。而通常我们只使用aws服务的一种或几种,那么我们可以单独引入使用的相关服务的包。其中kms和core是所有服务包的依赖包,为减少因版本可能带来的问题,建议也进行显式引入。这里我选择的版本是:1.11.538。

pom.xml

<!-- aws -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>${awsjavasdk.version}</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-kms</artifactId>
    <version>${awsjavasdk.version}</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>${awsjavasdk.version}</version>
    <scope>compile</scope>
</dependency>

 

连接awsAPI基本信息类,替换其中的ak、sk和区域。

AwsBaseClient

package com.study.awsbase;
 
import com.amazonaws.regions.Regions;
 
/**
 * 连接aws的api的基本信息
 *
 * @author guoj
 * @date 2019年10月8日 10:32:17
 */
public class AwsBaseClient {
 
    /**
     * Access key ID
     */
    protected String awsAccessKey = "ak";
    /**
     * Secret access key
     */
    protected String awsSecretKey = "sk";
    /**
     * 区域
     */
    protected Regions regions = Regions.CN_NORTH_1;
 
    public AwsBaseClient() {
    }
 
    public AwsBaseClient(String awsAccessKey, String awsSecretKey, Regions regions) {
        this.awsAccessKey = awsAccessKey;
        this.awsSecretKey = awsSecretKey;
        this.regions = regions;
    }
 
    public void setBaseClient(String awsAccessKey, String awsSecretKey, Regions regions) {
        this.awsAccessKey = awsAccessKey;
        this.awsSecretKey = awsSecretKey;
        this.regions = regions;
    }
 
    public AwsBaseClient withAwsAccessKey(String awsAccessKey) {
        this.awsAccessKey = awsAccessKey;
        return this;
    }
 
    public AwsBaseClient withAwsSecretKey(String awsSecretKey) {
        this.awsSecretKey = awsSecretKey;
        return this;
    }
 
    public AwsBaseClient withRegions(Regions regions) {
        this.regions = regions;
        return this;
    }
}

    获取连接s3桶客户端的类。这里提供了供子类获取默认s3客户端方法,供子类获取自定义s3客户端的方法,代外部类获取s3客户端的默认以自定义方法。

AwsS3Client

package com.study.s3;
 
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.study.awsbase.AwsBaseClient;
 
/**
 * 连接s3
 *
 * @author guoj
 * @date 2019年10月8日 10:32:17
 */
public class AwsS3Client extends AwsBaseClient {
 
    protected AmazonS3 s3;
 
    public AwsS3Client() {
        super();
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        this.s3 = AmazonS3ClientBuilder.standard().withRegion(regions).withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
    }
 
    public AwsS3Client(String awsAccessKey, String awsSecretKey, Regions regions) {
        super(awsAccessKey, awsSecretKey, regions);
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        this.s3 = AmazonS3ClientBuilder.standard().withRegion(regions).withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
    }
 
    public void setS3Client(String awsAccessKey, String awsSecretKey, Regions regions) {
        setBaseClient(awsAccessKey, awsSecretKey, regions);
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        this.s3 = AmazonS3ClientBuilder.standard().withRegion(regions).withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
    }
 
    public AmazonS3 getS3Client() {
        return s3;
    }
 
    public AmazonS3 getS3Client(String awsAccessKey, String awsSecretKey, Regions regions) {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        s3 = AmazonS3ClientBuilder.standard().withRegion(regions).withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
        return s3;
    }
 
}
s3桶常用操作类。

AwsS3Bucket

package com.study.s3;
 
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.model.analytics.AnalyticsConfiguration;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * s3桶常用操作
 *
 * @author guoj
 * @date 2019年10月8日 11:06:46
 */
public class AwsS3Bucket extends AwsS3Client {
 
    /**
     * s3桶名称
     * 全球唯一,如果是中国区域,则中国区域唯一
     */
    private String bucketName = "sinnet-test-bucket-001";
    /**
     * s3区域
     */
    private String region = Regions.CN_NORTH_1.getName();
 
    /**
     * 列出所有的s3桶
     */
    public void listBuckets() {
        List<Bucket> buckets = s3.listBuckets();
        buckets.forEach(item -> {
            System.out.println(item.toString());
        });
    }
 
    /**
     * 创建一个s3桶-默认
     */
    public void createBucketBase() {
        Bucket bucket = s3.createBucket(bucketName);
        System.out.println(bucket.toString());
    }
 
    /**
     * 创建一个s3桶-带参数
     */
    public void createBucketWithParams() {
        //指定名称和区域
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, region);
        //是否启用对象锁-启用后,阻止删除对象
        createBucketRequest.setObjectLockEnabledForBucket(true);
        Bucket bucket = s3.createBucket(createBucketRequest);
        System.out.println(bucket.toString());
    }
 
    /**
     * 删除一个s3桶
     */
    public void deleteBucket() {
        DeleteBucketRequest deleteBucketRequest = new DeleteBucketRequest(bucketName);
        s3.deleteBucket(deleteBucketRequest);
        System.out.println("delete bucket success");
    }
 
    /**
     * s3桶配置
     */
    public void configBucket() {
        /**
         * 加速配置
         */
        BucketAccelerateConfiguration bucketAccelerateConfiguration = new BucketAccelerateConfiguration(BucketAccelerateStatus.Enabled);
        s3.setBucketAccelerateConfiguration(bucketName, bucketAccelerateConfiguration);
        /**
         * 权限配置
         */
        //公共访问权限
        SetBucketAclRequest setBucketAclRequest = new SetBucketAclRequest(bucketName, CannedAccessControlList.Private);
        s3.setBucketAcl(setBucketAclRequest);
        //访问控制列表
        AccessControlList accessControlList = new AccessControlList();
        accessControlList.setRequesterCharged(true);
        accessControlList.setOwner(null);
        SetBucketAclRequest setBucketAclRequest2 = new SetBucketAclRequest(bucketName, accessControlList);
        s3.setBucketAcl(setBucketAclRequest2);
        /**
         * 分析配置
         */
        AnalyticsConfiguration analyticsConfiguration = new AnalyticsConfiguration();
        analyticsConfiguration.setId(null);
        SetBucketAnalyticsConfigurationRequest setBucketAnalyticsConfigurationRequest = new SetBucketAnalyticsConfigurationRequest(bucketName, analyticsConfiguration);
        s3.setBucketAnalyticsConfiguration(setBucketAnalyticsConfigurationRequest);
        /**
         * 生命周期配置
         */
        BucketLifecycleConfiguration bucketLifecycleConfiguration = new BucketLifecycleConfiguration();
        List<BucketLifecycleConfiguration.Rule> rules = new ArrayList();
        //需要预先制定规则
        BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule().withId(null);
        rules.add(rule);
        bucketLifecycleConfiguration.setRules(rules);
        SetBucketLifecycleConfigurationRequest setBucketLifecycleConfigurationRequest = new SetBucketLifecycleConfigurationRequest(bucketName, bucketLifecycleConfiguration);
        s3.setBucketLifecycleConfiguration(setBucketLifecycleConfigurationRequest);
        /**
         * 加密配置
         * 当对象存储在s3时默认是加密的
         */
        SetBucketEncryptionRequest setBucketEncryptionRequest = new SetBucketEncryptionRequest();
        setBucketEncryptionRequest.setBucketName(bucketName);
        ServerSideEncryptionConfiguration serverSideEncryptionConfiguration = new ServerSideEncryptionConfiguration();
        //同样,需要预先制定规则
        serverSideEncryptionConfiguration.setRules(null);
        setBucketEncryptionRequest.setServerSideEncryptionConfiguration(serverSideEncryptionConfiguration);
        s3.setBucketEncryption(setBucketEncryptionRequest);
        /**
         * 版本控制配置
         */
        BucketVersioningConfiguration bucketVersioningConfiguration = new BucketVersioningConfiguration();
        bucketVersioningConfiguration.setMfaDeleteEnabled(true);
        bucketVersioningConfiguration.setStatus(BucketVersioningConfiguration.ENABLED);
        SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = new SetBucketVersioningConfigurationRequest(bucketName, bucketVersioningConfiguration);
        s3.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);
 
        /**
         * 为s3指定一个策略-s3的策略是唯一的
         */
        s3.setBucketPolicy(null);
        /**
         * 日志记录配置
         */
        s3.setBucketLoggingConfiguration(null);
        /**
         * 通知配置
         */
        s3.setBucketNotificationConfiguration(null);
        /**
         * 复制配置
         */
        s3.setBucketReplicationConfiguration(null);
        /**
         * 标签配置
         */
        s3.setBucketTaggingConfiguration(null);
        /**
         * 静态网站托管配置
         */
        s3.setBucketWebsiteConfiguration(null);
        /**
         * 指标配置
         */
        s3.setBucketMetricsConfiguration(null);
 
    }
 
}

s3桶文件操作类:

AwsS3File

package com.study.s3;
 
import com.amazonaws.services.s3.model.*;
 
import java.io.*;
import java.util.List;
 
/**
 * s3桶文件的常用操作
 *
 * @author guoj
 * @date 2019年10月8日 14:30:36
 */
public class AwsS3File extends AwsS3Client {
 
    /**
     * s3桶名称
     */
    private String bucketName = "sinnet-test-bucket-001";
    /**
     * 上传到s3桶后的文件名
     */
    private String key = "test-folder/sinnet-test-file.txt";
    /**
     * 本地文件
     */
    private String localFilePath = "e:/test/s3/";
    private String localFileName = "1.txt";
    private String localFilePathName = localFilePath + localFileName;
 
    /**
     * 列出一个s3桶内的文件
     */
    public void listFiles() {
        //可以加入文件名前缀当作搜索条件
        String prefix = null;
        ObjectListing objectListing = s3.listObjects(bucketName, prefix);
        List<S3ObjectSummary> s3ObjectSummaryList = objectListing.getObjectSummaries();
        s3ObjectSummaryList.forEach(item -> {
            //文件路径及名称-如果是文件夹,以"/"标识路径
            System.out.print(item.getKey() + ",");
            //文件UUID
            System.out.println(item.getETag());
        });
    }
 
    /**
     * 上传一个文件到s3桶
     * 注意1:如果key相同,则替换
     * 注意2:如果key是一个层次路径,那么s3会自动创建相应文件夹
     */
    public void uploadFile() {
        File file = new File(localFilePathName);
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
        //设置权限属性等-非必需
//        putObjectRequest.setCannedAcl(null);
        //上传
        PutObjectResult putObjectResult = s3.putObject(putObjectRequest);
        System.out.println(putObjectResult.getETag());
    }
 
    /**
     * 从s3桶删除一个文件
     * 注意:如果删除的是最后一个文件,那么,上层文件夹也会被同时删除
     */
    public void deleteFile() {
        s3.deleteObject(bucketName, key);
    }
 
    /**
     * 获取一个文件
     *
     * @throws IOException
     */
    public S3Object downloadFile() throws IOException {
        //获取文件
        S3Object s3Object = s3.getObject(bucketName, key);
        //s3文件输入流,继承了FilterInputStream
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        //文件属性等数据
        ObjectMetadata objectMetadata = s3Object.getObjectMetadata();
        //文件的key-可以用来获取文件名
        System.out.println(s3Object.getKey());
        //桶名
        System.out.println(s3Object.getBucketName());
        System.out.println(s3Object.getRedirectLocation());
        System.out.println(s3Object.getTaggingCount());
        return s3Object;
    }
 
    /**
     * 获取一个文件,并打印出来
     *
     * @throws IOException
     */
    public void downloadFileWithPrint() throws IOException {
        S3Object s3Object = s3.getObject(bucketName, key);
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        //如果是txt文件,可以把内容打印出来
        StringBuffer stringBuffer = new StringBuffer();
        byte[] buffer = new byte[1024];
        while ((s3ObjectInputStream.read(buffer)) != -1) {
            stringBuffer.append(new String(buffer, "UTF-8"));
        }
        s3ObjectInputStream.close();
        System.out.println(stringBuffer.toString().trim());
    }
 
    /**
     * 获取一个文件,并保存到本地
     *
     * @throws IOException
     */
    public void downloadFileWithSave() throws IOException {
        S3Object s3Object = s3.getObject(bucketName, key);
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        OutputStream os = null;
        try {
            //文件名
            String fileName = s3Object.getKey().substring(s3Object.getKey().lastIndexOf("/"));
            os = new FileOutputStream(new File(localFilePath + fileName));
            byte[] buffer = new byte[1024];
            while ((s3ObjectInputStream.read(buffer)) != -1) {
                os.write(buffer);
            }
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
            if (s3ObjectInputStream != null) {
                s3ObjectInputStream.close();
            }
        }
    }
 
    /**
     * 复制一个文件
     * 比较简单,就是复制,可以选择原文件的版本
     */
    public void copyFile() {
        String sourceBucketName = bucketName;
        String sourceKey = key;
        String sourceVersionId = null;
        String destinationBucketName = bucketName;
        String destinationKey = key;
        CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceKey, sourceVersionId, destinationBucketName, destinationKey);
        CopyObjectResult copyObjectResult = s3.copyObject(copyObjectRequest);
        System.out.println(copyObjectResult.toString());
    }
 
}

    另外附上两个test类:

AwsS3BucketTest
package com.study.s3;

import org.junit.Test;


public class AwsS3BucketTest {

    private AwsS3Bucket awsS3Bucket = new AwsS3Bucket();

    @Test
    public void listBuckets() {
        awsS3Bucket.listBuckets();
    }

    @Test
    public void createBucketBase() {
        awsS3Bucket.createBucketBase();
    }

    @Test
    public void createBucketWithParams() {
    }

    @Test
    public void deleteBucket() {
        awsS3Bucket.deleteBucket();
    }

    @Test
    public void configBucket() {
        awsS3Bucket.configBucket();
    }
}
AwsS3FileTest
package com.study.s3;

import org.junit.Test;

import java.io.IOException;


public class AwsS3FileTest {

    private AwsS3File awsS3File = new AwsS3File();

    @Test
    public void listFiles() {
        awsS3File.listFiles();
    }

    @Test
    public void uploadFile() {
        awsS3File.uploadFile();
    }

    @Test
    public void deleteFile() {
    }

    @Test
    public void downloadFile() {
    }

    @Test
    public void downloadFileWithPrint() {
        try {
            awsS3File.downloadFileWithPrint();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void downloadFileWithSave() {
        try {
            awsS3File.downloadFileWithSave();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void copyFile() {
    }
}

扫描下方二维码,加入我们,获取更多关于云计算的文章

 

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: software.amazon.awssdk s3 api文档是Amazon Web Services的S3服务的官方API文档。该文档提供了详细的S3 API操作指南和使用示例,包括对象存储、桶(Bucket)管理、访问控制、CORS配置等方面的内容。 该文档主要面向S3服务的开发者,通过对API操作指南的阅读,开发者可以熟悉S3服务的基本操作和使用方式,从而能够更加高效地开发S3相关应用。 除了操作指南之外,该文档还提供了代码示例API参考,方便开发者编写和调试S3应用程序。所有API都有详细的参数说明和使用示例,以及方法的返回值。 总之,software.amazon.awssdk s3 api文档是S3开发者必备的宝典之一,对于想要了解和掌握S3服务的开发者来说,这本文档会极大地提高他们的开发效率和成果。 ### 回答2: software.amazon.awssdk s3 api文档是AWS S3 SDK的官方文档,其中包括了S3 SDK中所有的API方法和参数说明,以及示例代码。AWS S3 SDK是Amazon Web Services(AWS)提供的用于连接和操作AWS S3存储桶的软件开发工具包(SDK)。通过这个SDK,开发人员可以快速地将S3存储桶集成到他们的应用程序中,也可以在应用程序中增加对S3存储桶的功能。文档中描述了各种操作S3存储桶的API方法,如创建、读取、更新和删除存储桶、管理S3存储桶中的对象、设置存储桶权限等等。此外,文档还提供了详细的参数说明,让用户可以了解每个API方法的输入参数、返回参数、请求响应、异常处理等内容。对于想要使用AWS S3 SDK进行开发的用户,软件.amazon.awssdk s3 api文档是必备的参考资料,它能够帮助开发人员更好地了解S3 SDK的使用,提高开发效率和开发成功率。 ### 回答3: Software.amazon.awssdk s3 api文档是亚马逊AWS Java 开发工具包中用于与亚马逊S3存储服务交互的应用程序接口(API)文档。该文档提供了详细的开发指南和API文档,帮助开发人员在Java语言下使用AWS S3服务。 该文档的开发指南分为三个部分,即入门、开发和高级。入门部分涵盖了如何设置开发环境、创建AWS S3存储桶以及基本的对象和桶操作。开发部分着重介绍了如何上传和下载大文件、实现上传和下载进度监控和使用加密功能。高级部分则进一步讲解了如何使用对象标记、复制对象和批量操作等高级应用。 在API文档部分,开发人员可以快速了解每个API的用途、入参和出参的具体信息,并可查看示例代码和错误代码,以便更好地理解和运用API。此外,文档还提供了完整的SDK参考文档和一些常见问题的解决方案。 总的来说,软件.amazon.awssdk s3 api文档提供了非常详细的开发指南和API文档,加上丰富的示例代码和SDK文档,极大地方便了开发人员在Java语言下使用AWS S3服务。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值