Amazon S3 对象储存(以图片为例)

Kotlin
大数据
网络安全
云计算
0
0
{"value":"### **一、前言**\n亚马逊云科技提供了100余种产品免费套餐。其中,计算资源 Amazon EC2 首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。\n[https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el](https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el)\n在我们日常开发中,图片是非常常用的一种文件,一般来讲是采用url的方式进行加载的,那就有个问题了,离服务器的远近导致了延迟的问题,离服务器远的用户体验相对而言就不是很好了,那有没有办法可以解决这个问题,接下来介绍的 **Amazon S3(Simple Storage Service**)对象存储就是解决这个问题的,正文即将开始。\n### **二、Amazon S3 简介**\n**Amazon S3** 是一种对象存储服务,可将数据作为对象存储在存储桶中。 对象是一个可以存储任何允许的文件格式的最小单位,例如txt,png,apk等等。存储桶是对象的容器。要将数据存储在 **Amazon S3** 中,首先得创建一个存储桶并指定存储桶名称和 **Amazon** 区域(这个区域最好选择生产环境的临近结点)。然后,数据将作为 **Amazon S3** 中的对象上传到该存储桶。 每个对象都有一个键(可以包括路径名,Amazon S3 会自动完成转换),它是桶内对象的唯一标识符(免费版本最多支持300个对象)。S3 提供个性化的设置需求。 例如,可以使用 S3 的版本控制将一个对象的多个版本保存在同一个存储桶中,这样可以恢复意外删除或者覆盖的对象,版本控制功能需要开启相关的设置,默认不开启,比较消耗存储空间。存储桶中的对象默认是私有的,只有在开启外界访问权限时才能访问。 可以使用存储桶策略、**Amazon Identity and Access Management (IAM)** 策略、访问控制列表 **(ACL)** 和 **S3** 访问点等来管理访问。\n### **三、为何选择Amazon S3**\n**Amazon S3**全称Amazon Simple Storage Service 是Amazon (Amazon Web Service)中的产品之一,主要提供对象存储服务,那么为何选择Amazon S3 呢?基于以下几种原因考虑。\n- 高可靠的对象设计持久性\n对象设计持久性达到了19个九,即**99.999999999%**,即10000年只会发生一次对象丢失。\n- 灵活的对象储存方案\n使用 **S3 Intelligent-Tiering** 作为默认存储类,基于访问频率,可以自动调整对象存储的方式,降低对象储存成本。\n- 数据安全有保证\n提供服务端加密,客户端加密以及默认的加密方式,默认情况下只能自己访问存储桶中的对象。\n- 支持批量处理和跨区域复制\n不夸张的说可以通过s3同时操作亿万个对象,同时支持将对象复制到其他区域。\n\n### **四、部署环境**\n\n- **依赖引入**\n这里以 gradle 的部署为例。\nkotlin\n```\nimplementation \"software.amazon.awssdk:s3:2.17.172\"\n```\n- **创建客户端**\n这个是 s3 对象存储中必不可少的部分,这里简单配置一下,后面有需求可以随时添加和更改。\nkotlin\n```\nfun getS3client(): S3Client {\n //选择结点\n val region = Region.AP_NORTHEAST_1\n \n //登录凭据\n val provider: AwsCredentialsProvider = StaticCredentialsProvider.create(\n AwsBasicCredentials.create(\n accessKeyId,\n secretAccessKey\n )\n )\n return S3Client.builder()\n .credentialsProvider(provider)\n .region(region)\n .build()\n}\n```\n\n**accessKeyId** 和 **secretAccessKey** 可以进入个人设置里面的安全设置进行创建,可同时创建多个,但有一点需要注意,控制台不保存密钥,需要自己进行保存,会让你下载一个 csv 文件保存自己的密钥,当然其实也没关系,忘记了再创建一个,忘记的那个密钥要记得删除避免安全隐患。\n\n![image.png](https://dev-media.amazoncloud.cn/c8ac36a5b67b44d5a143225775bf1d0b_image.png)\n\n### **五、存储桶的创建与删除**\n#### **1.命名规则**\n至少3个字符,至多63个字符,必须以字母或者数字作为结尾和开头,特殊字符仅支持。\nkotlin\n```\n. 和 -\n```\n同时以下前缀和后缀不支持。\nkotlin\n```\n前缀:xn--\n后缀:-s3alias\n```\n最后要强调的一点是桶的名称在全部 Amazon 账户创建的桶中唯一的,即全球只会有一个!!\n\n#### **2.控制台创建和删除**\n- 打开**s3**[官网](https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fhome%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&forceMobileApp=0&code_challenge=_kFoZyxE13oqX9yeihuPYwQh62wanQl48uGVLpaemsc&code_challenge_method=SHA-256)\n\n![image.png](https://dev-media.amazoncloud.cn/ce08f16a87604ff982f344db0c1855db_image.png)\n\n- **创建一个 bucket**\n这里有一些选项需要填写,应该不是很困难,有一点需要注意选择区域的时候最好选最近的节点进行桶的部署,推荐 Tokyo 结点,这里可能不同的地区会有一点限制,例如,选择不了香港的结点,所以目前国内的访问还是比较慢的。\n\n![image.png](https://dev-media.amazoncloud.cn/cbecfbecf4ce4169b31b935cf8ea478d_image.png)\n\n- **bucket setting**\n这里主要功能是图片访问,为了方便测试,修改成任何人都能访问,以下选项全部取消勾选,默认是全部勾选(安全保护考虑)。\n\n![image.png](https://dev-media.amazoncloud.cn/e9334fd9559148e7b6566d938979f217_image.png)\n\n- **删除桶**\n点击delete即可删除。\n\n![image.png](https://dev-media.amazoncloud.cn/631de31720474a5aae7ca96fc94d0b6b_image.png)\n\nconsole 的操作都很简单,接下来介绍api的创建。\n\n#### **3.api创建和删除**\n这个利用最新的api,几行代码就可以搞定。\nkotlin\n```\nfun createBucket(s3Client: S3Client, bucketName: String) {\n val bucketRequest = CreateBucketRequest.builder()\n .bucket(bucketName)\n .build()\n s3Client.createBucket(bucketRequest)\n}\n```\n这里利用创建桶的api构造一个request,传入桶名和客户端就可以了,这里默认屏蔽所有外来访问,也可以设置相关的acls进行开放,有兴趣可以查看[官方demo](https://github.com/awsdocs/aws-doc-sdk-examples)了解一下,下面展示一下删除桶的代码,也是相当的简单。\nkotlin\n```\nfun deleteBucket(s3Client: S3Client,bucketName: String){\n val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()\n s3Client.deleteBucket(deleteRequest)\n}\n```\n### **六、上传图片**\n#### **1.控制台上传**\n这个比较简单,点击 upload 即可上传文件。\n\n![image.png](https://dev-media.amazoncloud.cn/f4c508d5a70f42079eea5ddbc6a0215b_image.png)\n\n#### **2.api 上传与删除**\napi 上传也很简单,简单配置一下参数就可以了。\n```\nfun uploadObject(s3Client: S3Client,bucketName: String){\n //上传对象的请求\n //这里需要自己设置上传桶的名称和图片的路径\n //img/hello.jpg即上传至img文件夹下的hello.jpg,若没有img文件夹则自动创建一个\n val putObjectRequest = PutObjectRequest\n .builder()\n .bucket(bucketName)\n .key(\"img/hello.jpg\").build()\n \n //本地的文件\n val file = File(\"C:\\\\Users\\\\user\\\\Desktop\\\\local.jpg\")\n \n //启用客户端开始上传\n s3Client.putObject(putObjectRequest, RequestBody.fromFile(file))\n}\n```\napi 的删除也很容易,参数和上传差不多。\n\n```\nfun deleteObject(s3Client: S3Client,bucketName: String,keyName:String){\n //这里的keyName即创建时的key,相当于对象在桶中的相对位置\n val deletedObjectRequest = DeleteObjectRequest\n .builder()\n .bucket(bucketName)\n .key(keyName)\n .build()\n s3Client.deleteObject(deletedObjectRequest)\n}\n```\n\n### **七、加载图片**\n#### **1.url 加载图片**\n这个需要在图片对象那里开启 public read 的权限,开启之后就可以直接通过 url 进行访问图片了。\n\n![image.png](https://dev-media.amazoncloud.cn/036fc0ca3f4e4be7b80d833f94e5da2e_image.png)\n\n这里的 object url 即对外开放的 url。\n\n![image.png](https://dev-media.amazoncloud.cn/67d2059a964a4d1084b6a81e722a7961_image.png)\n\n#### **2.获取图片对象进行下载**\n这里用代码进行下载,当然如果是桶的 owner,不需要进行权限处理即可访问。\n```\nfun getObject(s3Client: S3Client,bucketName: String,keyName:String){\n val getObjectRequest = GetObjectRequest\n .builder()\n .bucket(bucketName)\n .key(keyName)\n .build()\n \n //参数即本地存放路径\n val file = File(\"C:\\\\Users\\\\user\\\\Desktop\\\\get.jpg\")\n s3Client.getObject(getObjectRequest,file.toPath())\n}\n```\n### **八、踩坑经历**\n#### **1.两种 api**\n应该时 amazon Amazon 为了统一化风格,重写了 java 方面的 api,这就导致了文档和网上的各种操作用的依赖不同,刚开始就是一头雾水,官网推荐使用新版的 api 即 software 开头的,然而很多介绍性的文档还没更新是旧的 api,有些又是新的 api,刚开始的学习阶段很头疼。\n```\n//这里给出两种最新版本的依赖\n//一个以.com开头,一个以software开头\nimplementation (\"com.amazonaws:aws-java-sdk-s3:1.12.196\")\nimplementation (\"software.amazon.awssdk:s3:2.17.172\")\n```\n这里也是推荐使用新版的 api,风格形式比较简洁,api 风格比较统一,request 传入参数,通过链式调用创建一个 builder 后,然后build,最后 client 执行操作。\n\n```\n//以某某操作的request为参数\n//然后通过链式调用完成request参数的配置\n//最后调用s3Client完成request的具体操作\n//下面这个删除仅仅只用了两行代码就完成了删除操作\nval deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()\ns3Client.deleteBucket(deleteRequest)\n```\n#### **2.两个域名**\n刚开始不知道原来 amazon 在国内也有网站,然后一直用的国外的网站,访问速度感人。\n- [Amazon 中国站](https://www.amazonaws.cn/)\n- [Amazon 官网](https://aws.amazon.com/cn/)\n### **九、总结**\n亚马逊云科技提供了100余种产品免费套餐。其中,计算资源 Amazon EC2 首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB 标准存储容量。\n[https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el](https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&sc_channel=el)\n部署和实战的过程有些曲折,也有收获,部署最大的困难是文档的各异以及国内访问的速度的限制,然后最让人意外和欣慰的就是最后使用的 api 相当简洁和易用,感谢这套统一风格的 api,开发者友好型,下面给出主要的参考资料方便读者进一步探索更多高级的功能,类似加密处理,访问组控制,自带的 tag 进行查询等等,这里由于篇幅所限就不一一介绍了。\n[github参考样例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3)\n[入门参考](https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fget-started%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&forceMobileApp=0&code_challenge=Lw35Fp-CTA9ZoXNgGkhX4L86PPAlIhrmSgOYmP-BkEs&code_challenge_method=SHA-256)","render":"<h3><a id=\"_0\"></a><strong>一、前言</strong></h3>\n<p>亚马逊云科技提供了100余种产品免费套餐。其中,计算资源 Amazon EC2 首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。<br />\n<a href=\"https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el</a><br />\n在我们日常开发中,图片是非常常用的一种文件,一般来讲是采用url的方式进行加载的,那就有个问题了,离服务器的远近导致了延迟的问题,离服务器远的用户体验相对而言就不是很好了,那有没有办法可以解决这个问题,接下来介绍的 <strong>Amazon S3(Simple Storage Service</strong>)对象存储就是解决这个问题的,正文即将开始。</p>\n<h3><a id=\"Amazon_S3__4\"></a><strong>二、Amazon S3 简介</strong></h3>\n<p><strong>Amazon S3</strong> 是一种对象存储服务,可将数据作为对象存储在存储桶中。 对象是一个可以存储任何允许的文件格式的最小单位,例如txt,png,apk等等。存储桶是对象的容器。要将数据存储在 <strong>Amazon S3</strong> 中,首先得创建一个存储桶并指定存储桶名称和 <strong>Amazon</strong> 区域(这个区域最好选择生产环境的临近结点)。然后,数据将作为 <strong>Amazon S3</strong> 中的对象上传到该存储桶。 每个对象都有一个键(可以包括路径名,Amazon S3 会自动完成转换),它是桶内对象的唯一标识符(免费版本最多支持300个对象)。S3 提供个性化的设置需求。 例如,可以使用 S3 的版本控制将一个对象的多个版本保存在同一个存储桶中,这样可以恢复意外删除或者覆盖的对象,版本控制功能需要开启相关的设置,默认不开启,比较消耗存储空间。存储桶中的对象默认是私有的,只有在开启外界访问权限时才能访问。 可以使用存储桶策略、<strong>Amazon Identity and Access Management (IAM)</strong> 策略、访问控制列表 <strong>(ACL)</strong> 和 <strong>S3</strong> 访问点等来管理访问。</p>\n<h3><a id=\"Amazon_S3_6\"></a><strong>三、为何选择Amazon S3</strong></h3>\n<p><strong>Amazon S3</strong>全称Amazon Simple Storage Service 是Amazon (Amazon Web Service)中的产品之一,主要提供对象存储服务,那么为何选择Amazon S3 呢?基于以下几种原因考虑。</p>\n<ul>\n<li>高可靠的对象设计持久性<br />\n对象设计持久性达到了19个九,即<strong>99.999999999%</strong>,即10000年只会发生一次对象丢失。</li>\n<li>灵活的对象储存方案<br />\n使用 <strong>S3 Intelligent-Tiering</strong> 作为默认存储类,基于访问频率,可以自动调整对象存储的方式,降低对象储存成本。</li>\n<li>数据安全有保证<br />\n提供服务端加密,客户端加密以及默认的加密方式,默认情况下只能自己访问存储桶中的对象。</li>\n<li>支持批量处理和跨区域复制<br />\n不夸张的说可以通过s3同时操作亿万个对象,同时支持将对象复制到其他区域。</li>\n</ul>\n<h3><a id=\"_17\"></a><strong>四、部署环境</strong></h3>\n<ul>\n<li><strong>依赖引入</strong><br />\n这里以 gradle 的部署为例。<br />\nkotlin</li>\n</ul>\n<pre><code class=\"lang-\">implementation &quot;software.amazon.awssdk:s3:2.17.172&quot;\n</code></pre>\n<ul>\n<li><strong>创建客户端</strong><br />\n这个是 s3 对象存储中必不可少的部分,这里简单配置一下,后面有需求可以随时添加和更改。<br />\nkotlin</li>\n</ul>\n<pre><code class=\"lang-\">fun getS3client(): S3Client {\n //选择结点\n val region = Region.AP_NORTHEAST_1\n \n //登录凭据\n val provider: AwsCredentialsProvider = StaticCredentialsProvider.create(\n AwsBasicCredentials.create(\n accessKeyId,\n secretAccessKey\n )\n )\n return S3Client.builder()\n .credentialsProvider(provider)\n .region(region)\n .build()\n}\n</code></pre>\n<p><strong>accessKeyId</strong> 和 <strong>secretAccessKey</strong> 可以进入个人设置里面的安全设置进行创建,可同时创建多个,但有一点需要注意,控制台不保存密钥,需要自己进行保存,会让你下载一个 csv 文件保存自己的密钥,当然其实也没关系,忘记了再创建一个,忘记的那个密钥要记得删除避免安全隐患。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/c8ac36a5b67b44d5a143225775bf1d0b_image.png\" alt=\"image.png\" /></p>\n<h3><a id=\"_51\"></a><strong>五、存储桶的创建与删除</strong></h3>\n<h4><a id=\"1_52\"></a><strong>1.命名规则</strong></h4>\n<p>至少3个字符,至多63个字符,必须以字母或者数字作为结尾和开头,特殊字符仅支持。<br />\nkotlin</p>\n<pre><code class=\"lang-\">. 和 -\n</code></pre>\n<p>同时以下前缀和后缀不支持。<br />\nkotlin</p>\n<pre><code class=\"lang-\">前缀:xn--\n后缀:-s3alias\n</code></pre>\n<p>最后要强调的一点是桶的名称在全部 Amazon 账户创建的桶中唯一的,即全球只会有一个!!</p>\n<h4><a id=\"2_66\"></a><strong>2.控制台创建和删除</strong></h4>\n<ul>\n<li>打开<strong>s3</strong><a href=\"https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fhome%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&amp;client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&amp;forceMobileApp=0&amp;code_challenge=_kFoZyxE13oqX9yeihuPYwQh62wanQl48uGVLpaemsc&amp;code_challenge_method=SHA-256\" target=\"_blank\">官网</a></li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/ce08f16a87604ff982f344db0c1855db_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li><strong>创建一个 bucket</strong><br />\n这里有一些选项需要填写,应该不是很困难,有一点需要注意选择区域的时候最好选最近的节点进行桶的部署,推荐 Tokyo 结点,这里可能不同的地区会有一点限制,例如,选择不了香港的结点,所以目前国内的访问还是比较慢的。</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/cbecfbecf4ce4169b31b935cf8ea478d_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li><strong>bucket setting</strong><br />\n这里主要功能是图片访问,为了方便测试,修改成任何人都能访问,以下选项全部取消勾选,默认是全部勾选(安全保护考虑)。</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/e9334fd9559148e7b6566d938979f217_image.png\" alt=\"image.png\" /></p>\n<ul>\n<li><strong>删除桶</strong><br />\n点击delete即可删除。</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/631de31720474a5aae7ca96fc94d0b6b_image.png\" alt=\"image.png\" /></p>\n<p>console 的操作都很简单,接下来介绍api的创建。</p>\n<h4><a id=\"3api_88\"></a><strong>3.api创建和删除</strong></h4>\n<p>这个利用最新的api,几行代码就可以搞定。<br />\nkotlin</p>\n<pre><code class=\"lang-\">fun createBucket(s3Client: S3Client, bucketName: String) {\n val bucketRequest = CreateBucketRequest.builder()\n .bucket(bucketName)\n .build()\n s3Client.createBucket(bucketRequest)\n}\n</code></pre>\n<p>这里利用创建桶的api构造一个request,传入桶名和客户端就可以了,这里默认屏蔽所有外来访问,也可以设置相关的acls进行开放,有兴趣可以查看<a href=\"https://github.com/awsdocs/aws-doc-sdk-examples\" target=\"_blank\">官方demo</a>了解一下,下面展示一下删除桶的代码,也是相当的简单。<br />\nkotlin</p>\n<pre><code class=\"lang-\">fun deleteBucket(s3Client: S3Client,bucketName: String){\n val deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()\n s3Client.deleteBucket(deleteRequest)\n}\n</code></pre>\n<h3><a id=\"_107\"></a><strong>六、上传图片</strong></h3>\n<h4><a id=\"1_108\"></a><strong>1.控制台上传</strong></h4>\n<p>这个比较简单,点击 upload 即可上传文件。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/f4c508d5a70f42079eea5ddbc6a0215b_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"2api__113\"></a><strong>2.api 上传与删除</strong></h4>\n<p>api 上传也很简单,简单配置一下参数就可以了。</p>\n<pre><code class=\"lang-\">fun uploadObject(s3Client: S3Client,bucketName: String){\n //上传对象的请求\n //这里需要自己设置上传桶的名称和图片的路径\n //img/hello.jpg即上传至img文件夹下的hello.jpg,若没有img文件夹则自动创建一个\n val putObjectRequest = PutObjectRequest\n .builder()\n .bucket(bucketName)\n .key(&quot;img/hello.jpg&quot;).build()\n \n //本地的文件\n val file = File(&quot;C:\\\\Users\\\\user\\\\Desktop\\\\local.jpg&quot;)\n \n //启用客户端开始上传\n s3Client.putObject(putObjectRequest, RequestBody.fromFile(file))\n}\n</code></pre>\n<p>api 的删除也很容易,参数和上传差不多。</p>\n<pre><code class=\"lang-\">fun deleteObject(s3Client: S3Client,bucketName: String,keyName:String){\n //这里的keyName即创建时的key,相当于对象在桶中的相对位置\n val deletedObjectRequest = DeleteObjectRequest\n .builder()\n .bucket(bucketName)\n .key(keyName)\n .build()\n s3Client.deleteObject(deletedObjectRequest)\n}\n</code></pre>\n<h3><a id=\"_146\"></a><strong>七、加载图片</strong></h3>\n<h4><a id=\"1url__147\"></a><strong>1.url 加载图片</strong></h4>\n<p>这个需要在图片对象那里开启 public read 的权限,开启之后就可以直接通过 url 进行访问图片了。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/036fc0ca3f4e4be7b80d833f94e5da2e_image.png\" alt=\"image.png\" /></p>\n<p>这里的 object url 即对外开放的 url。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/67d2059a964a4d1084b6a81e722a7961_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"2_156\"></a><strong>2.获取图片对象进行下载</strong></h4>\n<p>这里用代码进行下载,当然如果是桶的 owner,不需要进行权限处理即可访问。</p>\n<pre><code class=\"lang-\">fun getObject(s3Client: S3Client,bucketName: String,keyName:String){\n val getObjectRequest = GetObjectRequest\n .builder()\n .bucket(bucketName)\n .key(keyName)\n .build()\n \n //参数即本地存放路径\n val file = File(&quot;C:\\\\Users\\\\user\\\\Desktop\\\\get.jpg&quot;)\n s3Client.getObject(getObjectRequest,file.toPath())\n}\n</code></pre>\n<h3><a id=\"_171\"></a><strong>八、踩坑经历</strong></h3>\n<h4><a id=\"1_api_172\"></a><strong>1.两种 api</strong></h4>\n<p>应该时 amazon Amazon 为了统一化风格,重写了 java 方面的 api,这就导致了文档和网上的各种操作用的依赖不同,刚开始就是一头雾水,官网推荐使用新版的 api 即 software 开头的,然而很多介绍性的文档还没更新是旧的 api,有些又是新的 api,刚开始的学习阶段很头疼。</p>\n<pre><code class=\"lang-\">//这里给出两种最新版本的依赖\n//一个以.com开头,一个以software开头\nimplementation (&quot;com.amazonaws:aws-java-sdk-s3:1.12.196&quot;)\nimplementation (&quot;software.amazon.awssdk:s3:2.17.172&quot;)\n</code></pre>\n<p>这里也是推荐使用新版的 api,风格形式比较简洁,api 风格比较统一,request 传入参数,通过链式调用创建一个 builder 后,然后build,最后 client 执行操作。</p>\n<pre><code class=\"lang-\">//以某某操作的request为参数\n//然后通过链式调用完成request参数的配置\n//最后调用s3Client完成request的具体操作\n//下面这个删除仅仅只用了两行代码就完成了删除操作\nval deleteRequest = DeleteBucketRequest.builder().bucket(bucketName).build()\ns3Client.deleteBucket(deleteRequest)\n</code></pre>\n<h4><a id=\"2_190\"></a><strong>2.两个域名</strong></h4>\n<p>刚开始不知道原来 amazon 在国内也有网站,然后一直用的国外的网站,访问速度感人。</p>\n<ul>\n<li><a href=\"https://www.amazonaws.cn/\" target=\"_blank\">Amazon 中国站</a></li>\n<li><a href=\"https://aws.amazon.com/cn/\" target=\"_blank\">Amazon 官网</a></li>\n</ul>\n<h3><a id=\"_194\"></a><strong>九、总结</strong></h3>\n<p>亚马逊云科技提供了100余种产品免费套餐。其中,计算资源 Amazon EC2 首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB 标准存储容量。<br />\n<a href=\"https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el\" target=\"_blank\">https://aws.amazon.com/cn/free/?nc2=h_ql_pr_ft&amp;all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all&amp;trk=e0213267-9c8c-4534-bf9b-ecb1c06e4ac6&amp;sc_channel=el</a><br />\n部署和实战的过程有些曲折,也有收获,部署最大的困难是文档的各异以及国内访问的速度的限制,然后最让人意外和欣慰的就是最后使用的 api 相当简洁和易用,感谢这套统一风格的 api,开发者友好型,下面给出主要的参考资料方便读者进一步探索更多高级的功能,类似加密处理,访问组控制,自带的 tag 进行查询等等,这里由于篇幅所限就不一一介绍了。<br />\n<a href=\"https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3\" target=\"_blank\">github参考样例</a><br />\n<a href=\"https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fget-started%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&amp;client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&amp;forceMobileApp=0&amp;code_challenge=Lw35Fp-CTA9ZoXNgGkhX4L86PPAlIhrmSgOYmP-BkEs&amp;code_challenge_method=SHA-256\" target=\"_blank\">入门参考</a></p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭
contact-us