• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

springboot 搞代码 4年前 (2022-01-05) 27次浏览 已收录 0个评论

这篇文章主要介绍了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));     GeneratePresignedU<a style="color:transparent">来源gao*daima.com搞@代#码网</a>rlRequest urlRequest = new GeneratePresignedUrlRequest(bucket, key);     URL url = client.generatePresignedUrl(urlRequest);     return url.toString(); }

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

大体上就是这样了。

End!

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

以上就是SpringBoot实现上传文件到AWS S3的代码的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringBoot实现上传文件到AWS S3的代码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址