SpringBoot對(duì)接AWS?S3實(shí)現(xiàn)上傳和查詢(xún)
1.aws S3介紹
AWS S3(Amazon Simple Storage Service)是亞馬遜提供的一種對(duì)象存儲(chǔ)服務(wù),旨在提供可擴(kuò)展、高可用性和安全的數(shù)據(jù)存儲(chǔ)解決方案。以下是AWS S3的一些主要特點(diǎn)和功能:
1.1. 對(duì)象存儲(chǔ)
- 對(duì)象存儲(chǔ)模型:S3使用對(duì)象存儲(chǔ)模型,數(shù)據(jù)以對(duì)象的形式存儲(chǔ)在桶(Bucket)中。每個(gè)對(duì)象由數(shù)據(jù)、元數(shù)據(jù)和唯一的標(biāo)識(shí)符(鍵)組成。
- 桶(Bucket):桶是存儲(chǔ)對(duì)象的容器。每個(gè)桶都有一個(gè)唯一的名稱(chēng),并且可以在全球范圍內(nèi)訪問(wèn)。
1.2. 高可用性和耐久性
- 耐久性:S3提供99.999999999%(11個(gè)9)的數(shù)據(jù)耐久性,確保數(shù)據(jù)在多個(gè)設(shè)施中冗余存儲(chǔ)。
- 高可用性:S3設(shè)計(jì)為具有高可用性,確保用戶(hù)可以隨時(shí)訪問(wèn)存儲(chǔ)的數(shù)據(jù)。
1.3. 可擴(kuò)展性
彈性擴(kuò)展:S3可以自動(dòng)擴(kuò)展以處理任意數(shù)量的數(shù)據(jù)和請(qǐng)求,無(wú)需用戶(hù)進(jìn)行容量規(guī)劃。
1.4. 安全性
- 訪問(wèn)控制:S3提供多種訪問(wèn)控制機(jī)制,包括桶策略、IAM策略和ACL(訪問(wèn)控制列表),以確保只有授權(quán)用戶(hù)能夠訪問(wèn)數(shù)據(jù)。
- 加密:支持在傳輸和靜態(tài)存儲(chǔ)時(shí)對(duì)數(shù)據(jù)進(jìn)行加密,提供多種加密選項(xiàng),包括服務(wù)器端加密(SSE)和客戶(hù)端加密。
1.5. 數(shù)據(jù)管理和分析
- 版本控制:S3支持對(duì)象版本控制,允許用戶(hù)保留和恢復(fù)對(duì)象的多個(gè)版本。
- 生命周期管理:用戶(hù)可以設(shè)置生命周期規(guī)則,以自動(dòng)轉(zhuǎn)移或刪除不再需要的數(shù)據(jù)。
- 事件通知:S3可以配置事件通知,以便在對(duì)象創(chuàng)建、刪除等操作時(shí)觸發(fā)Lambda函數(shù)、SNS通知等。
1.6. 集成和兼容性
- 與其他AWS服務(wù)集成:S3與AWS的其他服務(wù)(如EC2、Lambda、CloudFront等)無(wú)縫集成,支持?jǐn)?shù)據(jù)分析、備份、內(nèi)容分發(fā)等多種場(chǎng)景。
- 兼容性:S3兼容RESTful API,支持多種編程語(yǔ)言和SDK,方便開(kāi)發(fā)者進(jìn)行集成和使用。
1.7. 使用場(chǎng)景
- 備份和恢復(fù):用于數(shù)據(jù)備份和恢復(fù)解決方案。
- 靜態(tài)網(wǎng)站托管:可以托管靜態(tài)網(wǎng)站,支持自定義域名和HTTPS。
- 大數(shù)據(jù)分析:用于存儲(chǔ)和分析大數(shù)據(jù)集,支持與AWS Glue、Amazon Athena等服務(wù)集成。
- 媒體存儲(chǔ):用于存儲(chǔ)和分發(fā)音頻、視頻和圖像等媒體文件。
1.8. 定價(jià)
按需計(jì)費(fèi):S3采用按需計(jì)費(fèi)模式,用戶(hù)只需為實(shí)際使用的存儲(chǔ)空間和請(qǐng)求付費(fèi)。定價(jià)根據(jù)存儲(chǔ)類(lèi)型、數(shù)據(jù)傳輸和請(qǐng)求數(shù)量等因素而異。
2.AWS的訪問(wèn)密鑰(Access Key)和秘密密鑰(Secret Key)
要獲取AWS的訪問(wèn)密鑰(Access Key)和秘密密鑰(Secret Key),請(qǐng)按照以下步驟操作:
2.1. 登錄到AWS管理控制臺(tái)
訪問(wèn) AWS管理控制臺(tái) 并使用你的AWS賬戶(hù)登錄。
2.2. 訪問(wèn)IAM(身份與訪問(wèn)管理)
- 在控制臺(tái)主頁(yè),找到并點(diǎn)擊“IAM”服務(wù)。
- 在左側(cè)菜單中,選擇“用戶(hù)”。

2.3. 創(chuàng)建新用戶(hù)(如果需要)
如果你還沒(méi)有用戶(hù),或者想為特定的應(yīng)用創(chuàng)建一個(gè)新用戶(hù),可以按照以下步驟創(chuàng)建:
- 點(diǎn)擊“添加用戶(hù)”。
- 輸入用戶(hù)名,并選擇“編程訪問(wèn)”選項(xiàng)。
- 點(diǎn)擊“下一步:權(quán)限”。

2.4. 設(shè)置權(quán)限

你可以選擇將用戶(hù)添加到現(xiàn)有的用戶(hù)組,或者直接為用戶(hù)附加權(quán)限策略。
如果你只需要S3的訪問(wèn)權(quán)限,可以選擇“創(chuàng)建策略”,并使用以下JSON示例來(lái)創(chuàng)建一個(gè)只允許訪問(wèn)S3的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:", "Resource": "" } ] }
完成后,點(diǎn)擊“下一步:標(biāo)簽”,然后點(diǎn)擊“下一步:查看”。
確認(rèn)信息無(wú)誤后,點(diǎn)擊“創(chuàng)建用戶(hù)”。
2.5. 獲取訪問(wèn)密鑰和秘密密鑰
- 創(chuàng)建用戶(hù)后,你將看到一個(gè)成功頁(yè)面,其中包含“訪問(wèn)密鑰 ID”和“秘密訪問(wèn)密鑰”。
- 注意:秘密訪問(wèn)密鑰只會(huì)在此時(shí)顯示一次,請(qǐng)務(wù)必將其安全保存。如果丟失,你需要重新生成密鑰。
2.6. 配置密鑰
將獲取到的“訪問(wèn)密鑰 ID”和“秘密訪問(wèn)密鑰”填入你的application.properties文件中:
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
2.7. 安全性注意事項(xiàng)
- 不要將密鑰硬編碼:在生產(chǎn)環(huán)境中,建議使用環(huán)境變量或AWS Secrets Manager來(lái)管理密鑰。
- 最小權(quán)限原則:只授予用戶(hù)所需的最小權(quán)限,以降低安全風(fēng)險(xiǎn)。
- 定期輪換密鑰:定期更換訪問(wèn)密鑰以增強(qiáng)安全性。
通過(guò)以上步驟,你就可以獲取AWS的訪問(wèn)密鑰和秘密密鑰,并在Spring Boot應(yīng)用中進(jìn)行配置。
3.代碼工程
要在Spring Boot應(yīng)用中對(duì)接AWS S3服務(wù),實(shí)現(xiàn)文件的上傳和查詢(xún),你可以按照以下步驟進(jìn)行:
3.1. 添加依賴(lài)
在你的pom.xml中添加AWS SDK的依賴(lài):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot-demo</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>aws-s3</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.300</version> <!-- 請(qǐng)根據(jù)需要選擇合適的版本 -->
</dependency>
</dependencies>
</project>
3.2. 配置AWS憑證
你可以通過(guò)環(huán)境變量、系統(tǒng)屬性或配置文件來(lái)配置AWS憑證。以下是使用application.properties的示例:
cloud.aws.credentials.access-key=xxxx cloud.aws.credentials.secret-key=xxxx cloud.aws.region.static=xxx cloud.aws.s3.bucket=xxx proxy.host=127.0.0.1 proxy.port=1080
3.3. 創(chuàng)建S3配置類(lèi)
創(chuàng)建一個(gè)配置類(lèi)來(lái)初始化S3客戶(hù)端:
package com.et.aws.config;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetSocketAddress;
import java.net.Proxy;
@Configuration
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Value("${proxy.host:}") // 代理主機(jī)
private String proxyHost;
@Value("${proxy.port:}") // 代理端口
private int proxyPort;
@Bean
public AmazonS3 amazonS3() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
// 如果代理主機(jī)和端口不為空,則配置代理
if (!proxyHost.isEmpty() && proxyPort > 0) {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
builder.withClientConfiguration(new ClientConfiguration().withProxyHost(proxyHost).withProxyPort(proxyPort));
}
return builder.build();
}
}
3.4. 實(shí)現(xiàn)文件上傳和查詢(xún)功能
創(chuàng)建一個(gè)服務(wù)類(lèi)來(lái)處理文件的上傳和查詢(xún):
package com.et.aws.service;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@Service
public class S3Service {
@Autowired
private AmazonS3 amazonS3;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
public String uploadFile(MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
amazonS3.putObject(bucketName, fileName, inputStream, null);
return fileName;
}
public List<String> listFiles() {
ObjectListing objectListing = amazonS3.listObjects(bucketName);
List<String> fileNames = new ArrayList<>();
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
fileNames.add(objectSummary.getKey());
}
return fileNames;
}
}
3.5. 創(chuàng)建控制器
創(chuàng)建一個(gè)控制器來(lái)處理HTTP請(qǐng)求:
package com.et.aws.controller;
import com.et.aws.service.S3Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/api/s3")
public class S3Controller {
@Autowired
private S3Service s3Service;
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String fileName = s3Service.uploadFile(file);
return ResponseEntity.ok("File uploaded: " + fileName);
} catch (IOException e) {
return ResponseEntity.status(500).body("File upload failed: " + e.getMessage());
}
}
@GetMapping("/files")
public ResponseEntity<List<String>> listFiles() {
List<String> files = s3Service.listFiles();
return ResponseEntity.ok(files);
}
}
以上只是一些關(guān)鍵代碼,所有代碼請(qǐng)參見(jiàn)下面代碼倉(cāng)庫(kù)
代碼倉(cāng)庫(kù)
github.com/Harries/springboot-demo(aws-s3)
4. 測(cè)試
啟動(dòng)你的Spring Boot應(yīng)用,并使用Postman或其他工具測(cè)試文件上傳和查詢(xún)功能。
上傳文件
發(fā)送POST請(qǐng)求到/api/s3/upload,并在請(qǐng)求中附加文件。

查詢(xún)文件
發(fā)送GET請(qǐng)求到/api/s3/files,將返回存儲(chǔ)在S3中的文件列表。

注意事項(xiàng)
- 確保你的AWS IAM用戶(hù)具有對(duì)S3的訪問(wèn)權(quán)限。
- 根據(jù)需要處理異常和錯(cuò)誤情況。
- 你可以根據(jù)需要擴(kuò)展功能,例如文件刪除、文件下載等。
通過(guò)以上步驟,你就可以在Spring Boot應(yīng)用中成功對(duì)接AWS S3服務(wù),實(shí)現(xiàn)文件的上傳和查詢(xún)。
以上就是SpringBoot對(duì)接AWS S3實(shí)現(xiàn)上傳和查詢(xún)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot AWS S3的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mybatis定義sql語(yǔ)句標(biāo)簽之delete標(biāo)簽解析
這篇文章主要介紹了mybatis定義sql語(yǔ)句標(biāo)簽之delete標(biāo)簽解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java中的@Conditional條件注解詳細(xì)解析
這篇文章主要介紹了Java中的@Conditional條件注解詳細(xì)解析,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿(mǎn)足條件給容器注冊(cè)bean,需要的朋友可以參考下2023-11-11
java實(shí)體對(duì)象與Map之間的轉(zhuǎn)換工具類(lèi)代碼實(shí)例
這篇文章主要介紹了java實(shí)體對(duì)象與Map之間的轉(zhuǎn)換工具類(lèi)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Jmeter參數(shù)化實(shí)現(xiàn)原理及過(guò)程解析
這篇文章主要介紹了Jmeter參數(shù)化實(shí)現(xiàn)原理及過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java代碼審計(jì)的一些基礎(chǔ)知識(shí)你知道嗎
這篇文章主要介紹了基于Java的代碼審計(jì)功能的基礎(chǔ)知識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
Java基礎(chǔ)之重載(Overload)與重寫(xiě)(Override)詳解
這篇文章主要介紹了Java基礎(chǔ)之重載(Overload)與重寫(xiě)(Override)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
springboot-dubbo cannot be cast to問(wèn)題及解決
這篇文章主要介紹了springboot-dubbo cannot be cast to問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法
通過(guò)Java程序展示如何來(lái)實(shí)現(xiàn)創(chuàng)建模板,并通過(guò)郵件合并功能來(lái)合并文本數(shù)據(jù)和圖片數(shù)據(jù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):棧
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-07-07

