SpringBoot實現(xiàn)上傳文件到AWS S3的代碼
簡單記錄一下在Springboot中上傳文件到AWS S3存儲服務(wù)的代碼。
在 application.xml
中添加aws相關(guān)配置:
custom: aws: access-key: CHOBITACCESSKEY secret-key: CHOBIT/THISIS006SECRET007Key/dotORG bucket: zhyea endpoint: www.zhyea.com:80
新建一個 AwsS3Componment
類來執(zhí)行上傳文件操作:
@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(); } }
因為使用的服務(wù)有設(shè)置endpoint,所以這里需要使用下面這一行完成endpoint的設(shè)置:
withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, Regions.CN_NORTH_1.getName()))
如果不設(shè)置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的這行配置中還設(shè)置了region信息。如果不需要設(shè)置endpoint,就得補上region的配置:
this.client = AmazonS3ClientBuilder .standard() .withClientConfiguration(config) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, accessSecret))) .withRegion(Regions.CN_NORTH_1) //Region配置 .enablePathStyleAccess() .build();
下面是執(zhí)行上傳的代碼:
/** * 執(zhí)行文件上傳 * * @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
實例執(zhí)行的上傳。有時候會需要直接通過文件流執(zhí)行上傳,此時可以使用下面的代碼:
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()
最好配置一下。不設(shè)置會在處理的時候給出WARN。根據(jù)方法文檔也可以看到,如果不設(shè)置,在上傳的時候就會先在內(nèi)存中緩存整個信息流來計算文件長度。
大體上就是這樣了。
End!
以上就是SpringBoot實現(xiàn)上傳文件到AWS S3的代碼的詳細內(nèi)容,更多關(guān)于SpringBoot 上傳文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Java代碼的 微信長鏈轉(zhuǎn)短鏈接口使用 post 請求封裝Json(實例)
下面小編就為大家?guī)硪黄獪\談Java代碼的 微信長鏈轉(zhuǎn)短鏈接口使用 post 請求封裝Json(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動示例詳解
這篇文章主要介紹了java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動示例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01javax.validation.constraints如何校驗參數(shù)合法性
本文將深入探討javax.validation.constraints的基本用法和高級應(yīng)用,幫助讀者更好地理解和運用這個強大的校驗框架,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Windows同時配置兩個jdk環(huán)境變量的操作步驟
Java Development Kit (JDK) 是開發(fā)Java應(yīng)用程序的基礎(chǔ),包含了編譯器、調(diào)試器以及其他必要的工具,本指南將一步步指導(dǎo)您完成在Windows操作系統(tǒng)上同時配置兩個jdk環(huán)境變量的操作步驟,需要的朋友可以參考下2024-09-09Spring Boot 中常用的注解@RequestParam及基本用法
@RequestParam 是 Spring Framework 和 Spring Boot 中常用的注解之一,用于從請求中獲取參數(shù)值,本文給大家介紹Spring Boot 中常用的注解@RequestParam,感興趣的朋友一起看看吧2023-10-10Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息
最近在開發(fā)中需要從request中獲取操作系統(tǒng),瀏覽器及瀏覽器版本信息,所以下面這篇文章主要給的大家介紹了關(guān)于Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-10-10