赞
踩
最近的工作中,碰到了要把华为云obs替换成亚马逊的aws的工作,经过一周的翻阅文档,以及踩坑经历后,终于是完成了工作内容,并且腾出时间来总结一下awsS3这个服务的东东,话不多说,开始吧:
既然是教程,就要有准备工作,以下内容默认你已经有了:
1、亚马逊的aws账户
2、创建了存储通(权限默认是阻止公众访问的)这里是引用官方文档创建存储通的指南
3、拿到了access-key跟secret-key
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(); }
其实,我们可以通过我们的桶的名字跟区域跟上传的keyID获取到我们的图片:但是前提是,我们要把我们的桶的权限打开
官网修改存储桶访问策略的回复
若是还不明白的话直接百度修改aws桶的访问策略就行。
然后我们就可以通过链接直接访问图片了。
举个例子:
桶的名字:bucket-test
区域:ap-east-1
keyId:20200922/test那么我们这个图片的访问地址就是:
https://bucket-test.s3.ap-east-1.amazonaws.com/20200922/test
其实登录控制台去找我们这个图片的时候最下面一行就是这个地址:
这里就没图演示了,控制台我不能登~,唉 不给我账号密码。。。。
注意:这个链接能访问的前提就是我们的桶的访问策略要公开,不然的话访问就是会报一串xml:access defined。而且路径错了或者没有这个文件的话也会报这个错误。
当然是可以的,就使用预签名url上传对象,再去获取就行了 但是有个坑,你上传完返回的那个url访问不到的,必须通过另外一个download方法获取到url才能访问,而且最大日期只能7天。具体明天再更。。。今晚太晚了。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。