SpringBoot對接阿里云OSS的詳細步驟和流程
以下是 Spring Boot 對接阿里云 OSS 的詳細步驟和流程,結(jié)合官方網(wǎng)頁和最佳實踐整理而成:
一、準備工作
??注冊阿里云賬號??
- 訪問阿里云官網(wǎng)完成注冊和實名認證。
??開通 OSS 服務(wù)??
- 登錄阿里云控制臺 → 進入 OSS 服務(wù) → 開通對象存儲 OSS。
??創(chuàng)建 Bucket??
- 進入 OSS 控制臺 → 點擊「創(chuàng)建 Bucket」→ 填寫名稱(如
my-bucket)、地域(如華北2北京)→ 存儲類型選擇「標準存儲」→ 權(quán)限選擇「私有」。
??獲取 AccessKey??
- 進入「AccessKey 管理」→ 創(chuàng)建 RAM 子用戶(推薦)→ 保存
AccessKey ID和AccessKey Secret。
二、Spring Boot 項目配置
1. 添加依賴
在 pom.xml 中添加 OSS SDK 和 Web 依賴:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.0</version> <!-- 使用最新穩(wěn)定版本 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
??注意??:若使用 Java 11+,需添加 JAXB 依賴:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>3.0.2</version>
</dependency>
2. 配置 OSS 參數(shù)
在 application.yml 中配置:
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com # Bucket 所在地域的 Endpoint
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
bucket-name: your-bucket-name
max-file-size: 10MB # 最大文件限制(可選)
allowed-extensions: jpg,jpeg,png,pdf # 允許的文件類型(可選)
3. 創(chuàng)建配置類
通過 @ConfigurationProperties 讀取配置并初始化 OSSClient:
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
public class OssConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
@Component
public class OssClientFactory {
@Autowired
private OssConfig ossConfig;
private OSS ossClient;
@PostConstruct
public void init() {
ossClient = new OSSClientBuilder().build(
ossConfig.getEndpoint(),
ossConfig.getAccessKeyId(),
ossConfig.getAccessKeySecret()
);
}
@PreDestroy
public void shutdown() {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
三、實現(xiàn)文件上傳功能
1. 文件上傳服務(wù)類
@Service
@RequiredArgsConstructor
public class OssService {
private final OssConfig ossConfig;
private final OssClientFactory ossClientFactory;
public String uploadFile(MultipartFile file) {
// 校驗文件
validateFile(file);
// 生成唯一文件名(避免重復(fù))
String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
try (InputStream inputStream = file.getInputStream()) {
// 上傳到 OSS
ossClientFactory.getOssClient().putObject(
ossConfig.getBucketName(),
fileName,
inputStream
);
// 生成訪問 URL
return generateAccessUrl(fileName);
} catch (IOException e) {
throw new RuntimeException("文件上傳失敗", e);
}
}
private String generateAccessUrl(String fileName) {
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000); // URL 有效期 1 小時
return ossClientFactory.getOssClient().generatePresignedUrl(
ossConfig.getBucketName(),
fileName,
expiration
).toString();
}
private void validateFile(MultipartFile file) {
// 校驗文件大小
if (file.getSize() > parseSize(ossConfig.getMaxFileSize())) {
throw new RuntimeException("文件大小超過限制");
}
// 校驗文件類型
String extension = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase();
if (!Arrays.asList(ossConfig.getAllowedExtensions().split(",")).contains(extension)) {
throw new RuntimeException("不支持的文件類型");
}
}
private long parseSize(String size) {
// 解析如 "10MB" 為字節(jié)單位
// 實現(xiàn)略...
}
}
2. 控制器層
@RestController
@RequestMapping("/api/oss")
@RequiredArgsConstructor
public class OssController {
private final OssService ossService;
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
String url = ossService.uploadFile(file);
return ResponseEntity.ok(url);
}
}
四、測試與部署
??本地測試??
- 使用 Postman 發(fā)送 POST 請求到
/api/oss/upload,選擇文件上傳。 - 返回的 URL 即為 OSS 中文件的訪問地址。
??部署注意事項??
- ??安全建議??:避免硬編碼 AccessKey,推薦使用 RAM 子用戶和 STS 臨時憑證。
- ??性能優(yōu)化??:大文件建議使用分片上傳(
MultipartUpload)。 - ??存儲類型??:根據(jù)訪問頻率選擇標準存儲、低頻存儲或歸檔存儲。
五、擴展功能
??文件下載??
public void downloadFile(String fileName, String localPath) {
ossClientFactory.getOssClient().getObject(
new GetObjectRequest(ossConfig.getBucketName(), fileName),
new File(localPath)
);
}
??文件刪除??
public void deleteFile(String fileName) {
ossClientFactory.getOssClient().deleteObject(
ossConfig.getBucketName(),
fileName
);
}
??圖片處理??
// 添加水印
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileName);
request.addResponseHeader("x-oss-process", "image/watermark,image_aHR0cDovL3Npb2FsQ0hJTmV3UzIwMjMxMDA1,size_20,text_QDUxQ1RPQ0hJTmV3UzIwMjMxMDA1001");
URL url = ossClient.generatePresignedUrl(request);
六、常見問題
??AccessKey 權(quán)限不足??
- 檢查 RAM 子用戶是否已授權(quán) OSS 的
oss:PutObject等權(quán)限。
??文件上傳失敗??
- 檢查 Bucket 是否存在、網(wǎng)絡(luò)是否連通、文件大小是否超出限制。
??URL 無法訪問??
- 確認 Bucket 的讀寫權(quán)限是否為「私有」時需使用簽名 URL。
通過以上步驟,即可實現(xiàn) Spring Boot 與阿里云 OSS 的完整對接。如需進一步優(yōu)化,可參考阿里云 OSS 官方網(wǎng)頁。
以上就是SpringBoot對接阿里云OSS的詳細步驟和流程的詳細內(nèi)容,更多關(guān)于SpringBoot對接阿里云OSS的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Java中由于數(shù)據(jù)太大自動轉(zhuǎn)換成科學(xué)計數(shù)法的問題
今天小編就為大家分享一篇解決Java中由于數(shù)據(jù)太大自動轉(zhuǎn)換成科學(xué)計數(shù)法的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題
這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題,文中有詳細的解決步驟,如果有遇到一樣問題的小伙伴,可以參考閱讀本文2023-09-09
MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
詳解OpenFeign服務(wù)調(diào)用(微服務(wù))
OpenFeign是Spring Cloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequesMapping等等,這篇文章主要介紹了OpenFeign服務(wù)調(diào)用的相關(guān)知識,需要的朋友可以參考下2022-07-07
SpringBoot項目application.yml文件數(shù)據(jù)庫配置密碼加密的方法
這篇文章主要介紹了SpringBoot項目application.yml文件數(shù)據(jù)庫配置密碼加密的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
淺談System.getenv()和System.getProperty()的區(qū)別
這篇文章主要介紹了System.getenv()和System.getProperty()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

