最近的工作中,碰到了要把华为云obs替换成亚马逊的aws的工作,经过一周的翻阅文档,以及踩坑经历后,终于是完成了工作内容,并且腾出时间来总结一下awsS3这个服务的东东,话不多说,开始吧:

既然是教程,就要有准备工作,以下内容默认你已经有了:

1、亚马逊的aws账户
2、创建了存储通(权限默认是阻止公众访问的)

这里是引用官方文档创建存储通的指南

3、拿到了access-key跟secret-key

1⃣️ 开工:首先是上传一张图片到桶里:

import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
    /**
     * 上传文件方法
     */
    public void upload(){

        // 通过access-key跟secret-key 生成认证的aws凭证对象
        AwsCredentials awsCredentials = new AwsCredentials() {
            @Override
            public String accessKeyId() {
                return ak;
            }

            @Override
            public String secretAccessKey() {
                return sk;
            }
        };

        // 通过凭证对象 awsCredentials 跟 区域 region 生成s3的服务端(我这里选择的亚太地区香港的区域)
        S3AsyncClient client = S3AsyncClient.builder()
                .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
                .region(Region.AP_EAST_1)
                .build();
        
        /**
         * keyId:就是跟在我们图片链接比如 https://awsexamplebucket1.s3.us-west-2.amazonaws.com/photos/puppy 
         * 中的 photos/puppy 
         * 
         * contentType: 默认不设置的话是什么ostream什么之类的访问链接的话就会下载图片,这里因为我的需求就是拼接出图片链接访问
         * 要直接显示,所以要设置;
         * 
         * 这里整个就是异步上传图片的过程了,最后要记得把s3服务client关闭哦!
         */
        String keyId = "test";
        CompletableFuture<PutObjectResponse> future = client.putObject(
                PutObjectRequest
                        .builder().bucket(bucketName)
                        .key(keyId)
                        .contentType("text/plain image/jpeg image/png")
                        .build(),
                AsyncRequestBody.fromFile(Paths.get("/Users/payne/Desktop/test.jpg"))
        );

        future.whenComplete((resp, err) -> {
            try {
                if (resp != null) {
                    System.out.println("my response: " + resp);
                } else {
                    // Handle error
                    err.printStackTrace();
                }
            } finally {
                // Lets the application shut down. Only close the client when you are completely done with it.
                client.close();
            }
        });

        future.join();

    }

2⃣️获取图片的链接

其实,我们可以通过我们的桶的名字跟区域跟上传的keyID获取到我们的图片:但是前提是,我们要把我们的桶的权限打开
官网修改存储桶访问策略的回复
若是还不明白的话直接百度修改aws桶的访问策略就行。
然后我们就可以通过链接直接访问图片了。
举个例子:

桶的名字:bucket-test
区域:ap-east-1
keyId:20200922/test

那么我们这个图片的访问地址就是:
https://bucket-test.s3.ap-east-1.amazonaws.com/20200922/test
其实登录控制台去找我们这个图片的时候最下面一行就是这个地址:
这里就没图演示了,控制台我不能登~,唉 不给我账号密码。。。。

注意:这个链接能访问的前提就是我们的桶的访问策略要公开,不然的话访问就是会报一串xml:access defined。而且路径错了或者没有这个文件的话也会报这个错误。

3⃣️这里又有问题了:我不想公开桶的访问权限能不能通过api取到访问url呢?

当然是可以的,就使用预签名url上传对象,再去获取就行了 但是有个坑,你上传完返回的那个url访问不到的,必须通过另外一个download方法获取到url才能访问,而且最大日期只能7天。具体明天再更。。。今晚太晚了。。

Logo

亚马逊云科技开发者 Build On 是由亚马逊团队策划、开发者社区联合打造的动手实操系列活动。

更多推荐