阿里云對象存儲OSS
介紹
- 阿里云對象存儲OSS是一款非常強大的云存儲服務——提供的海量、安全、低成本、高持久性的對象存儲服務,通過RESTful API提供HTTP接口。
- 核心特性:
- 無限擴展:存儲空間和文件數量無上限。
- 多存儲類型:提供標準、低頻訪問、歸檔、冷歸檔、深度冷歸檔等多種存儲類型,覆蓋從熱到冷的全部數據場景。
- 高安全性:提供多種加密方式(服務器端/客戶端)、權限控制、WORM(一次寫入,多次讀取)特性,滿足合規要求。
- 智能處理:內置圖片處理、視頻截幀等媒體處理功能。
- 優勢:
- 穩定可靠:支持大規模場景。
- ??成本優化??:按量付費,無最低消費,支持生命周期管理自動轉換存儲類型以節約成本。
- ??簡單易用??:提供控制臺、命令行工具、圖形化工具及多種語言SDK,方便管理。
- 應用場景
- 網站/應用的動靜分離,存儲靜態資源(圖片、音視頻、文檔等)。
- 靜態網站托管。
- 數據備份與歸檔,結合生命周期管理降低長期存儲成本。
- 大數據分析與AI的底層數據湖存儲。
- 核心概念
- 存儲空間:存儲文件(對象)的容器,名稱在
OSS范圍內必須全局唯一。可設置其所在地域、訪問權限和存儲類型等屬性。
- 對象/文件:這是OSS存儲數據的基本單元,由數據本身、
元數據和鍵key組成。鍵可理解為文件的唯一標識,可包含類似目錄結構的后綴(如 data/images/logo.jpg)來模擬文件夾層級
- 地域:指OSS的數據中心所在的物理位置——用戶離地域越近訪問速度越快。
- 使用方式:控制臺、命令行工具、SDK、圖形化桌面工具。
Java代碼
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.11.2</version>
</dependency>
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
public class OSSConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
@Bean(destroyMethod = "shutdown")
public OSS ossClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.yyds.admin.config.OSSConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@Service
@RequiredArgsConstructor
public class OSSService {
private final OSS ossClient;
private final OSSConfig ossConfig;
public static final String POINT = ".";
/**
* 上傳文件
*
* @param file 文件
* @param filePath 存放的路徑
* @return 文件路徑
*/
public String uploadFile(MultipartFile file, String filePath) {
try {
ossClient.putObject(ossConfig.getBucketName(), filePath, file.getInputStream());
/* 方式二:指定訪問文件時的打開方式
指定文件訪問時的默認打開方式——如pdf文件,使用阿里云oss提供的默認域名訪問文件時默認是下載,而不是預覽。
由于阿里云oss為自身安全考慮訪問所使用策略,如需默認打開是預覽,需要配置自己的域名進行訪問。
以下代碼使用自定義域名訪問時生效,使用阿里云oss提供的默認域名訪問文件時將失效——阿里云oss平臺策略優先級比代碼控制高。
PutObjectRequest request = new PutObjectRequest(ossConfig.getBucketName(), filePath, file.getInputStream());
// 創建元數據對象并設置關鍵屬性:Content-Type (MIME類型)、Content-Disposition
ObjectMetadata metadata = new ObjectMetadata();
// 1、設置訪問是預覽模式 inline
metadata.setContentDisposition("inline");
// 2、設置訪問是下載模式 attachment
metadata.setContentDisposition("attachment");
metadata.setContentType("application/pdf");
request.setMetadata(metadata);
ossClient.putObject(request);
*/
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
return "https://" + ossConfig.getBucketName() + POINT + ossConfig.getEndpoint() + File.separator + filePath;
}
/**
* 下載文件 以字節數組形式返回 根據完整的path下載
* @param filePath 下載文件路徑 如:https://guangzhou.aliyuncs.com/data/pdf/2025/10/7/2345.pdf
* @return 字節數組
*/
public byte[] downLoad(String filePath) {
try {
OSSObject object = ossClient.getObject(new GetObjectRequest(ossConfig.getBucketName(), formatPath(filePath)));
InputStream stream = object.getObjectContent();
return stream.readAllBytes();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* 指定路徑文件上傳
* @param file 文件
* @param filePath 指定路徑 如:http://guangzhou.aliyuncs.com/data/pdf/2025/10/7/2345.pdf
* @return 完整文件路徑
*/
public String uploadFileAttachPath(MultipartFile file, String filePath) {
try {
ossClient.putObject(ossConfig.getBucketName(), formatPath(filePath), file.getInputStream());
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
return filePath;
}
/**
* 刪除文件
* @param filePath 文件路徑
*/
public void deleteFile(String filePath) {
try {
ossClient.deleteObject(ossConfig.getBucketName(), formatPath(filePath));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* 根據路徑獲取不包含Bucket名稱在內的Object完整路徑:data/pdf/2025/10/7/2345.jpg
* @param filePath 文件路徑
*/
public String formatPath(String filePath) {
String path = "https://" + ossConfig.getBucketName() + POINT + ossConfig.getEndpoint() + File.separator;
return filePath.replace(path, "");
}
}