栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

简单记录一下在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();

下面是执行上传的代码:


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 上传文件的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/130834.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号