AmzoneS3上传文件权限问题

目录

1.背景

2.环境

3.问题和解决方法

4.参考文档


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博客

MultipartFile File相互转化 - 孤城丶闭 - 博客园

快速入门 - 对象存储 OSS - 阿里云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值