目录
1.背景
项目中遇到一个使用Amzone S3上传文件到对象存储后,权限不满足预期的问题。调试了很久,百度了很久。最终还是综合各种信息,加上自己理解,才搞定这一问题。回头看,问题本身并不难,还是自己需要多修炼。这里简单做个记录吧,也是对“坑”内经验的总结。
2.环境
JDK:1.8.0_111
Springboot:2.1.2.RELEASE
AmzoneS3:aws-java-sdk-s3 v1.11.830
3.问题和解决方法
在S3源码中,这里有4个函数,均可用于文件上传
PutObjectResult putObject(PutObjectRequest var1) throws SdkClientException, AmazonServiceException;
PutObjectResult putObject(String var1, String var2, File var3) throws SdkClientException, AmazonServiceException;
PutObjectResult putObject(String var1, String var2, InputStream var3, ObjectMetadata var4) throws SdkClientException, AmazonServiceException;
PutObjectResult putObject(String var1, String var2, String var3) throws AmazonServiceException, SdkClientException;
当时觉得第二种方式较为简单,结果就此开启“坑途”。中间还有个插曲,因为在SpringBoot中,采用了MultipartFile方式上传文件,还扒了扒怎样将MultipartFile转化为File。
采用File方式上传的文件,缺省是private权限,即私有读写,可以通过getObjectAcl()查看权限。
解决方法:采用第三个函数,在header中设置权限
public void upload(MultipartFile file){
String fileName = file.getOriginalFilename();
try{
AmazonS3 s3 = ...; // 这里是连接对象存储的实例
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setHeader("x-amz-acl", "public-read");
InputStream inputStream = file.getInputStream();
s3.putObject(BUCKET_NAME, fileName, inputStream, objectMetadata) // BUCKET_NAME已设定好的bucket
s3.shutdown();
}catch(Exception e){
e.printStackTrace();
}
}
4.参考文档
Access control list (ACL) overview - Amazon Simple Storage Service
亚马逊网络服务-AWS S3 node.js SDK上传的文件和文件夹权限 - ITranslater
管理Amazon S3存储桶和对象的访问权限 - AWS SDK for Java
如何通过亚马逊S3 API设置在上传时文件的权限 - IT屋-程序员软件开发技术分享社区
使用AWS SDK for Java 上传和下载文件_maowenbei的博客-CSDN博客