SpringBoot实现上传文件到AWS S3的代码

 更新时间:2020年10月27日 09:14:47   作者:白42  
这篇文章主要介绍了SpringBoot实现上传文件到AWS S3的代码,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下

简单记录一下在Springboot中上传文件到AWS S3存储服务的代码。

application.xml中添加aws相关配置:

custom:
  aws:
    access-key: CHOBITACCESSKEY
    secret-key: CHOBIT/THISIS006SECRET007Key/dotORG
    bucket: zhyea
    endpoint: www.zhyea.com:80

新建一个 AwsS3Componment类来执行上传文件操作:

@Component
public class AwsS3Component implements InitializingBean {
 
    @Value("${custom.aws.access-key}")
    private String accessKey;
 
    @Value("${custom.aws.secret-key}")
    private String accessSecret;
 
    @Value("${custom.aws.bucket}")
    private String bucket;
 
    @Value("${custom.aws.endpoint}")
    private String endpoint;
 
    private AmazonS3 client;
 
 
    @Override
    public void afterPropertiesSet() {
        ClientConfiguration config = new ClientConfiguration();
        config.setProtocol(Protocol.HTTP);
        config.disableSocketProxy();
 
        this.client = AmazonS3ClientBuilder
                .standard()
                .withClientConfiguration(config)
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, accessSecret)))
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, Regions.CN_NORTH_1.getName()))
                .enablePathStyleAccess()
                .build();
    }
}

因为使用的服务有设置endpoint,所以这里需要使用下面这一行完成endpoint的设置:

withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, Regions.CN_NORTH_1.getName()))

如果不设置endpoint就会收到下面这样的报错:

com.amazonaws.services.s3.model.AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId; Request ID: FRDT8N0RAQFNCVDP; S3 Extended Request ID: DemEatwroXry2YN/5lyuMKDmhIi/aIz3QZPmLN0DYHeHU3oGUeOClJBcToz1J1qkcBZBfklRNs8=)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1660)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1324)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1074)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701)

异常信息中提示了AccessKey无效——虽然我的AccessKey是有效的。

在endpoint的这行配置中还设置了region信息。如果不需要设置endpoint,就得补上region的配置:

this.client = AmazonS3ClientBuilder
        .standard()
        .withClientConfiguration(config)
        .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, accessSecret)))
        .withRegion(Regions.CN_NORTH_1) //Region配置
        .enablePathStyleAccess()
        .build();

下面是执行上传的代码:

/**
 * 执行文件上传
 *
 * @param file 要上传的文件的路径
 * @param key  存储文件的路径
 * @return 文件路径
 */
private String upload(File file, String key) {
    client.putObject(new PutObjectRequest(bucket, key, file).withCannedAcl(CannedAccessControlList.PublicRead));
    GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucket, key);
    URL url = client.generatePresignedUrl(urlRequest);
    return url.toString();
}

这里是通过 File实例执行的上传。有时候会需要直接通过文件流执行上传,此时可以使用下面的代码:

private String upload(InputStream input, String key) throws IOException {
    Date expireDate = new Date(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(30));
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setHttpExpiresDate(expireDate);
    metadata.setContentLength(input.available());
 
    client.putObject(new PutObjectRequest(bucket, key, input, metadata).withCannedAcl(CannedAccessControlList.PublicRead));
    GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucket, key);
    URL url = client.generatePresignedUrl(urlRequest);
    return url.toString();
}

注意这里的 setContentLength()最好配置一下。不设置会在处理的时候给出WARN。根据方法文档也可以看到,如果不设置,在上传的时候就会先在内存中缓存整个信息流来计算文件长度。

大体上就是这样了。

End!

以上就是SpringBoot实现上传文件到AWS S3的代码的详细内容,更多关于SpringBoot 上传文件的资料请关注脚本之家其它相关文章!

相关文章

  • slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换

    slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换

    这篇文章主要介绍了slf4j、jcl、jul、log4j1、log4j2、logback的大总结,各个组件的jar包以及目前系统日志需要切换实现方式的方法,有需要的朋友可以借鉴参考下
    2022-03-03
  • java算法入门之有效的括号删除有序数组中的重复项实现strStr

    java算法入门之有效的括号删除有序数组中的重复项实现strStr

    大家好,我是哪吒,一个热爱编码的Java工程师,本着"欲速则不达,欲达则欲速"的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程
    2021-08-08
  • list集合去除重复对象的实现

    list集合去除重复对象的实现

    下面小编就为大家带来一篇list集合去除重复对象的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • JPA如何使用entityManager执行SQL并指定返回类型

    JPA如何使用entityManager执行SQL并指定返回类型

    这篇文章主要介绍了JPA使用entityManager执行SQL并指定返回类型的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java中归并排序和Master公式详解

    java中归并排序和Master公式详解

    大家好,本篇文章主要讲的是java中归并排序和Master公式详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Java中内存区域的划分与异常详解

    Java中内存区域的划分与异常详解

    最近在看java虚拟相关知识,把每天看到的一些内容做一个归纳总结,下面这篇文章主要给大家介绍了关于Java中内存区域的划分与异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-06-06
  • Java中JSON字符串进行各种转换的方法小结

    Java中JSON字符串进行各种转换的方法小结

    Gson和Hutool的JSONUtil都是常用的用于处理JSON数据的工具库,它们提供了简单易用的API来进行JSON字符串的解析、转换和操作,下面就跟随小编一起学习一下如果使用他们实现JSON字符串的各种转换吧
    2024-01-01
  • 关于Spring Cloud实现日志管理模块

    关于Spring Cloud实现日志管理模块

    这篇文章主要介绍了关于Spring Cloud实现日志管理模块问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java解析XML几种方式小结

    java解析XML几种方式小结

    本文给大家汇总了4种java解析XML的方法,结合具体的示例,非常的详细,有需要的小伙伴可以参考下
    2016-01-01
  • Spring启动时实现初始化的几种方案

    Spring启动时实现初始化的几种方案

    这篇文章主要介绍了Spring启动时实现初始化的几种方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论