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() {

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

同时,亚马逊S3云存储API还支持多种高级功能,如自定义文件元数据、CORS(跨域资源共享)配置、本管理等,可以根据项目需要进行相应的配置和调整。通过使用S3云存储API,开发者可以方便地上传、下载、管理和删除云存储上的文件,并在各种应用场景中灵活使用。通过以上步骤,开发者可以基于亚马逊S3云存储API开发出功能强大、稳定可靠的云存储应用程序。同时,为了提高应用程序的性能和安全性,建议开发者深入学习和理解亚马逊S3云存储API的各项特性和最佳实践,以便更好地利用API提供的功能。三、配置API访问凭证。 好久没有写博客,学期接近尾声,时间方面会宽松些了,其实想写的东西还挺多的。前段时间一个项目用到了几个云存储,其中就包括Amazon S3,于是这篇文章主要分享一些Amazon S3 Rest API的经验(Amazon S3还包括SOAP API) ### 1 ,文章和教程 : 1. 目的 : 文章和教程部分提供了深入的文档,旨在为使用 AWS 的开发人员提供实际帮助。 2. 创建人 : 它们由 AWS 开发人员社区或 Amazon 团队的成员创建 3. 效果 : 基于 AWS 服务的实际使用提供结构化的示例、分析、提示、技巧和指南。 ### 2 ,emr 是什么 : 1. 官网 : Amazon EMR是一种web服务,可以轻松高效地处理大量数据。Amazon EMR使用Hadoop处理结合几个AWS产品来完 地面真理标签工作简介 这些示例提供了快速演练,以帮助您入门和使用Amazon SageMaker Ground Truth的贴标作业工作流。 功能的是一个端到端示例,展示了如何将自定义培训,推理逻辑和主动学习功能带入Amazon SageMaker生态系统。 是一个端到端示例,该示例以未标记的数据集开头,使用地面真相API对其进行标记,分析结果,训练图像分类神经使用带注释的数据集进行网络分析,最后使用经过训练的模型执行批处理和在线推理。 是一个类似的端到端示例,但用于对象检测任务。 显示图表以可视化每个类别的注释数量,从而区分人工注释和自动标签(如果您的工作使用自动标签)。 它还显示每个班级中的示例图像,并创建一个pdf,以简洁地显示完整结果。 引入了“扩展清单”的概念,并演示了标签作业的输出文件可以立即用作训练SageMaker机器学习模型的输入文件。 演示了用于完成标签工作的Amazon SageMaker Ground Truth注释合并技术,用于图像分类 import com.amazonaws.services.s3.AmazonS3; //导入方法依赖的package包/类@Overridepublic Parameters handleRequest(Parameters parameters, Context context) {context.getLogger().log("Input Function [" + context.get... 按图中的模型,可简单理解为S3是由若干个桶(Bucket)组成,每个桶中包含若干个不同标识的对象(Object),还有就是统一的访问入口(RESTful API),这样基本就足够了。如下图,我们可以把S3的存储空间想象成无限的,想存储一个任意格式的文件到S3服务中,只需要知道要把它放到哪个桶(Bucket)中,它的名字(Object Id)应该是什么。PS:客户现场部署的S3是浪潮公司提供的,如果现场遇到这个情况,就不要固执去找对方对线了,完全没用。最终换成了S3官方SDK可用了。 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;im... 基于浏览器的 Direct To S3 上传 将文件直接上传到 S3,而不是中间服务器,是减少服务器负载的好方法。 虽然此演示使用 Python 和 Flask,但代码应该很容易转换为其他语言和框架。 AWS 签名本 4 创建此演示时,大多数直接到 S3 上传的示例都使用 AWS 签名本 2。但是,法兰克福 (eu-central-1) 等新 AWS 区域仅支持签名 v4。 基于表单的示例 基于表单的示例只需要 HTML,不需要 JavaScript。 它的简单性使其成为探索 API 选项的有用工具。 基于 Dropzone 的示例 基于 Dropzone 的示例演示了 CORS 兼容性和动态 S3 对象键。 希望这也表明,稍加修饰,直接上传到 S3 可以提供出色的用户体验。 配置存储桶 CORS 政策 对于基于 JavaScript 的上传,必须向存储桶添加 CORS 策略。 先决条件:将存储库和依赖项添加到build.gradle repositories { maven { url "https://dl.bintray.com/buzzvil/maven/" } maven { url 'https://s3.amazonaws.com/moat-sdk-builds' } dependencies { compile("com.buzzvil.buzzad:buzzad-sdk:1.+") compile('com.android.support:multidex:1.0.1') 第1步:设 最近听了一次亮哥他们AWS的首次session,中间稍微提到了一下IAM account的access key。没想到在项目中给别人code review的时候就接触到了,是针对AWS S3的。具体S3说明,见http://aws.amazon.com/s3/Setting up project1. AWS SDK for Javacom.amazonawsaws-java-sdk1.9.22. ...