当前位置:   article > 正文

第三方对接-云存储-最新亚马逊Amazon云AWS S3服务JAVA上传图片,访问图片教程(API版本2.14.22)

第三方对接-云存储-最新亚马逊Amazon云AWS S3服务JAVA上传图片,访问图片教程(API版本2.14.22)

最近的工作中,碰到了要把华为云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();

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

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天。具体明天再更。。。今晚太晚了。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/285880
推荐阅读
相关标签
  

闽ICP备14008679号