第三方对接-云存储-最新亚马逊Amazon云AWS S3服务JAVA上传图片,访问图片教程(API版本2.14.22)
最近的工作中,碰到了要把华为云obs替换成亚马逊的aws的工作,经过一周的翻阅文档,以及踩坑经历后,终于是完成了工作内容,并且腾出时间来总结一下awsS3这个服务的东东,话不多说,开始吧:既然是教程,就要有准备工作,以下内容默认你已经有了:1、亚马逊的aws账户2、创建了存储通(权限默认是阻止公众访问的)这里是引用官方文档创建存储通的指南3、拿到了access-key跟secret-key1⃣️
最近的工作中,碰到了要把华为云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天。具体明天再更。。。今晚太晚了。。
更多推荐
所有评论(0)