SpringBoot实现上传文件到AWS S3的代码
简单记录一下在Springboot中上传文件到AWSS3存储服务的代码。
在application.xml中添加aws相关配置:
custom: aws: access-key:CHOBITACCESSKEY secret-key:CHOBIT/THISIS006SECRET007Key/dotORG bucket:zhyea endpoint:www.zhyea.com:80
新建一个AwsS3Componment类来执行上传文件操作:
@Component publicclassAwsS3ComponentimplementsInitializingBean{ @Value("${custom.aws.access-key}") privateStringaccessKey; @Value("${custom.aws.secret-key}") privateStringaccessSecret; @Value("${custom.aws.bucket}") privateStringbucket; @Value("${custom.aws.endpoint}") privateStringendpoint; privateAmazonS3client; @Override publicvoidafterPropertiesSet(){ ClientConfigurationconfig=newClientConfiguration(); config.setProtocol(Protocol.HTTP); config.disableSocketProxy(); this.client=AmazonS3ClientBuilder .standard() .withClientConfiguration(config) .withCredentials(newAWSStaticCredentialsProvider(newBasicAWSCredentials(accessKey,accessSecret))) .withEndpointConfiguration(newAwsClientBuilder.EndpointConfiguration(endpoint,Regions.CN_NORTH_1.getName())) .enablePathStyleAccess() .build(); } }
因为使用的服务有设置endpoint,所以这里需要使用下面这一行完成endpoint的设置:
withEndpointConfiguration(newAwsClientBuilder.EndpointConfiguration(endpoint,Regions.CN_NORTH_1.getName()))
如果不设置endpoint就会收到下面这样的报错:
com.amazonaws.services.s3.model.AmazonS3Exception:TheAWSAccessKeyIdyouprovideddoesnotexistinourrecords.(Service:AmazonS3;StatusCode:403;ErrorCode:InvalidAccessKeyId;RequestID:FRDT8N0RAQFNCVDP;S3ExtendedRequestID:DemEatwroXry2YN/5lyuMKDmhIi/aIz3QZPmLN0DYHeHU3oGUeOClJBcToz1J1qkcBZBfklRNs8=) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1660) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1324) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1074) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719) atcom.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701)
异常信息中提示了AccessKey无效——虽然我的AccessKey是有效的。
在endpoint的这行配置中还设置了region信息。如果不需要设置endpoint,就得补上region的配置:
this.client=AmazonS3ClientBuilder .standard() .withClientConfiguration(config) .withCredentials(newAWSStaticCredentialsProvider(newBasicAWSCredentials(accessKey,accessSecret))) .withRegion(Regions.CN_NORTH_1)//Region配置 .enablePathStyleAccess() .build();
下面是执行上传的代码:
/** *执行文件上传 * *@paramfile要上传的文件的路径 *@paramkey 存储文件的路径 *@return文件路径 */ privateStringupload(Filefile,Stringkey){ client.putObject(newPutObjectRequest(bucket,key,file).withCannedAcl(CannedAccessControlList.PublicRead)); GeneratePresignedUrlRequesturlRequest=newGeneratePresignedUrlRequest(bucket,key); URLurl=client.generatePresignedUrl(urlRequest); returnurl.toString(); }
这里是通过File实例执行的上传。有时候会需要直接通过文件流执行上传,此时可以使用下面的代码:
privateStringupload(InputStreaminput,Stringkey)throwsIOException{ DateexpireDate=newDate(System.currentTimeMillis()+TimeUnit.DAYS.toMillis(30)); ObjectMetadatametadata=newObjectMetadata(); metadata.setHttpExpiresDate(expireDate); metadata.setContentLength(input.available()); client.putObject(newPutObjectRequest(bucket,key,input,metadata).withCannedAcl(CannedAccessControlList.PublicRead)); GeneratePresignedUrlRequesturlRequest=newGeneratePresignedUrlRequest(bucket,key); URLurl=client.generatePresignedUrl(urlRequest); returnurl.toString(); }
注意这里的setContentLength()最好配置一下。不设置会在处理的时候给出WARN。根据方法文档也可以看到,如果不设置,在上传的时候就会先在内存中缓存整个信息流来计算文件长度。
大体上就是这样了。
End!
以上就是SpringBoot实现上传文件到AWSS3的代码的详细内容,更多关于SpringBoot上传文件的资料请关注毛票票其它相关文章!