Amazon S3对象储存

  一、前言

  亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。

  %20Tier%20Types=all&awsf.Free%20Tier%20Categories=all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el

  在我们日常开发中,图片是非常常用的一种文件,一般来讲是采用url的方式进行加载的,那就有个问题了,离服务器的远近导致了延迟的问题,离服务器远的用户体验相对而言就不是很好了,那有没有办法可以解决这个问题,接下来介绍的Amazon S3(Simple Storage Service)对象存储就是解决这个问题的,正文即将开始。

  二、Amazon S3 简介

  Amazon S3 是一种对象存储服务,可将数据作为对象存储在存储桶中。 对象是一个可以存储任何允许的文件格式的最小单位,例如txt,png,apk等等。存储桶是对象的容器。要将数据存储在 Amazon S3 中,首先得创建一个存储桶并指定存储桶名称和 AWS 区域(这个区域最好选择生产环境的临近结点)。然后,数据将作为 Amazon S3 中的对象上传到该存储桶。 每个对象都有一个键(可以包括路径名,Amazon S3会自动完成转换),它是桶内对象的唯一标识符(免费版本最多支持300个对象)。S3 提供个性化的设置需求。 例如,可以使用 S3 的版本控制将一个对象的多个版本保存在同一个存储桶中,这样可以恢复意外删除或者覆盖的对象,版本控制功能需要开启相关的设置,默认不开启,比较消耗存储空间。存储桶中的对象默认是私有的,只有在开启外界访问权限时才能访问。 可以使用存储桶策略、AWS Identity and Access Management (IAM) 策略、访问控制列表 (ACL) 和 S3 访问点等来管理访问。

  三、为何选择Amazon S3

  Amazon S3全称Amazon Simple Storage Service 是AWS(Amazon Web Service)中的产品之一,主要提供对象存储服务,那么为何选择Amazon S3 呢?基于以下几种原因考虑

  四、部署环境 五、存储桶的创建与删除 1.命名规则

  至少3个字符,至多63个字符,必须以字母或者数字作为结尾和开头,特殊字符仅支持

   . 和 -

  同时以下前缀和后缀不支持

   前缀:xn--

    后缀:-s3alias

  最后要强调的一点是桶的名称在全部AWS账户创建的桶中唯一的,即全球只会有一个!!

  2.控制台创建和删除

  console 的操作都很简单,接下来介绍api的创建

  3.api创建和删除

  这个利用最新的api,几行代码就可以搞定

   fun createBucket(s3Client: S3Client, bucketName: String) {

        val bucketRequest = CreateBucketRequest.builder()
            .bucket(bucketName)
            .build()
        s3Client.createBucket(bucketRequest)
    }

  这里利用创建桶的api构造一个request,传入桶名和客户端就可以了,这里默认屏蔽所有外来访问,也可以设置相关的acls进行开放,有兴趣可以查看官方demo了解一下

  下面展示一下删除桶的代码,也是相当的简单

   fun deleteBucket(s3Client: S3Client,bucketName: String){

        val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()
        s3Client.deleteBucket(deleteRequest)
    }

  六、上传图片 1.控制台上传

  这个比较简单,点击upload即可上传文件

  在这里插入图片描述

  2.api上传与删除

  api上传也很简单,简单配置一下参数就可以了

   fun uploadObject(s3Client: S3Client,bucketName: String){

        //上传对象的请求
        //这里需要自己设置上传桶的名称和图片的路径
        //img/hello.jpg即上传至img文件夹下的hello.jpg,若没有img文件夹则自动创建一个
        val putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key("img/hello.jpg").build()
        
        //本地的文件
        val file = File("C:\\Users\\user\\Desktop\\local.jpg")
        
        //启用客户端开始上传
        s3Client.putObject(putObjectRequest, RequestBody.fromFile(file))
    }

  api的删除也很容易,参数和上传差不多

   fun deleteObject(s3Client: S3Client,bucketName: String,keyName:String){

        //这里的keyName即创建时的key,相当于对象在桶中的相对位置
        val deletedObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(keyName).build()
        s3Client.deleteObject(deletedObjectRequest)
    }

  七、加载图片 1.url加载图片

  这个需要在图片对象那里开启public read的权限,开启之后就可以直接通过url进行访问图片了

  在这里插入图片描述

  这里的object url即对外开放的url

  在这里插入图片描述

  2.获取图片对象进行下载

  这里用代码进行下载,当然如果是桶的owner,不需要进行权限处理即可访问

   fun getObject(s3Client: S3Client,bucketName: String,keyName:String){

        val getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(keyName).build()
        
        //参数即本地存放路径
        val file = File("C:\\Users\\user\\Desktop\\get.jpg")
        s3Client.getObject(getObjectRequest,file.toPath())
    }

  八、踩坑经历 1.两种api

  应该时amazon aws为了统一化风格,重写了java方面的api,这就导致了文档和网上的各种操作用的依赖不同,刚开始就是一头雾水,官网推荐使用新版的api,然而很多介绍性的文档还没更新是旧的api,有些又是新的api,刚开始的学习阶段很头疼。

   //这里给出两种最新版本的依赖

    //一个以.com开头,一个以software开头
    implementation ("com.amazonaws:aws-java-sdk-s3:1.12.196")
    implementation ("software.amazon.awssdk:s3:2.17.172")

  不过这里还是推荐使用新版的api,风格形式真的相当简洁,会一种操作其他的也是一样

   //以某某操作的request为参数

    //然后通过链式调用完成request参数的配置
    //最后调用s3Client完成request的具体操作
    //下面这个删除仅仅只用了两行代码就完成了删除操作
    val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()
    s3Client.deleteBucket(deleteRequest)

  2.两个域名

  刚开始不知道原来amazon在国内也有网站,然后一直用的国外的网站,访问速度感人

  九、总结

  亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。

  %20Tier%20Types=all&awsf.Free%20Tier%20Categories=all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el

  部署和实战的过程有些曲折,也有收获,部署最大的困难是文档的各异以及国内访问的速度的限制,然后最让人意外和欣慰的就是最后使用的api相当简洁和易用,感谢这套统一风格的api,开发者友好型,下面给出主要的参考资料方便读者进一步探索更多高级的功能,类似加密处理,访问组控制,自带的tag进行查询等等,这里由于篇幅所限就不一一介绍了。

  github参考样例

  入门参考

最后修改:2024 年 08 月 07 日
如果觉得我的文章对你有用,请随意赞赏