使用阿里云 OSS 对象存储服务学习笔记
🔧 1. 准备工作
1.1 账号准备
- 注册阿里云账户
🔗 访问阿里云注册页面完成注册
✅ 注册后需完成实名认证
- 登录阿里云控制台
👨💻 使用注册账号登录控制台
1.2 开通 OSS 云服务
- 在控制台中搜索并找到 对象存储 OSS 服务
- 首次访问需点击 “开通服务” 完成开通
- 进入对象存储控制台
- 创建 Bucket:
🗂️ 点击左侧 “Bucket 列表”→“创建 Bucket”→ 配置地域、权限等基本信息
1.3 配置 AccessKey
1
2
3
4
5
6
7
8
9
10
11
|
# 临时环境变量(仅当前终端生效)
set OSS_ACCESS_KEY_ID=your_access_key_id
set OSS_ACCESS_KEY_SECRET=your_access_key_secret
# 永久生效(需重启终端或系统)
setx OSS_ACCESS_KEY_ID "%OSS_ACCESS_KEY_ID%"
setx OSS_ACCESS_KEY_SECRET "%OSS_ACCESS_KEY_SECRET%"
# 验证配置是否生效
echo %OSS_ACCESS_KEY_ID%
echo %OSS_ACCESS_KEY_SECRET%
|
🚀 2. 快速入门
2.1 添加依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<!-- 核心依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<!-- 辅助依赖(JAXB相关,用于XML解析) -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
|
2.2 基础示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import java.io.FileInputStream;
public class OSSDemo {
public static void main(String[] args) {
// 关键配置:Endpoint、Bucket名称、对象键(文件名)
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
String bucketName = "your-bucket-name";
String objectName = "demo.jpg";
// 创建OSS客户端(从环境变量读取AccessKey)
OSS ossClient = new OSSClientBuilder()
.build(endpoint,
new EnvironmentVariableCredentialsProvider());
try {
// 上传本地文件(需提前准备local.jpg)
ossClient.putObject(bucketName, objectName,
new FileInputStream("local.jpg"));
System.out.println("文件上传成功!");
} finally {
// 关闭客户端连接
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
|
🧩 3. 项目集成方案
3.1 REST 接口设计
3.2 核心组件实现
配置属性类(统一管理OSS参数)
1
2
3
4
5
6
7
8
9
10
11
12
|
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
private String endpoint; // OSS访问域名(如:https://oss-cn-beijing.aliyuncs.com)
private String bucketName; // Bucket名称
private String region; // 地域(如:cn-beijing)
}
|
上传工具类(封装核心操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.aliyun.oss.OSS;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Component
public class OSSUploadUtils {
@Autowired
private OSS ossClient;
@Autowired
private AliyunOSSProperties ossConfig;
public String upload(byte[] fileBytes, String originalFilename) {
// 生成唯一文件路径(按年月分目录 + UUID命名)
String fileDir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
String fileSuffix = getFileExtension(originalFilename);
String filePath = fileDir + "/" + UUID.randomUUID() + fileSuffix;
// 执行上传
ossClient.putObject(ossConfig.getBucketName(), filePath,
new ByteArrayInputStream(fileBytes));
// 生成访问URL
return String.format("%s/%s/%s",
ossConfig.getEndpoint().replace("https://", ""),
ossConfig.getBucketName(),
filePath);
}
private String getFileExtension(String filename) {
return filename.substring(filename.lastIndexOf("."));
}
}
|
控制器实现(处理文件上传请求)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class FileUploadController {
@Autowired
private OSSUploadUtils ossUploadUtils;
@PostMapping("/upload")
public Result<String> handleUpload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return Result.error("文件不能为空");
}
try {
String url = ossUploadUtils.upload(
file.getBytes(),
file.getOriginalFilename()
);
return Result.success(url);
} catch (Exception e) {
return Result.error("文件上传失败:" + e.getMessage());
}
}
}
// 通用返回结果类
class Result<T> {
private int code;
private String msg;
private T data;
// 省略构造方法、Getter/Setter
}
|
🎯 4. 优化策略
配置管理方案对比
方案 |
优点 |
缺点 |
@Value 注解 |
简单直接,适合少量配置 |
配置分散在代码中,维护成本高 |
@ConfigurationProperties |
集中管理在 YAML 文件,类型安全 |
需要创建独立配置类 |
推荐配置方式(YAML 集中管理)
1
2
3
4
5
6
|
# application.yml
aliyun:
oss:
endpoint: https://oss-cn-beijing.aliyuncs.com # OSS域名
bucketName: production-bucket # 生产环境Bucket
region: cn-beijing # 地域
|
1
2
3
|
// 自动注入配置类
@Autowired
private AliyunOSSProperties ossConfig;
|
📝 5. 最佳实践总结
-
环境隔离
🔄 为开发(dev)、测试(test)、生产(prod)环境分别创建独立 Bucket,避免资源混用
-
安全策略
🔒 使用 RAM 子账号替代主账号 AccessKey,并通过 RAM 策略限制子账号仅能操作指定 Bucket
-
性能优化
⚡ 大文件(>100MB)使用分片上传(Upload Part),小文件使用直传(Put Object)
-
监控告警
📊 在阿里云监控中配置 OSS 请求失败率、流量峰值等告警规则
-
成本控制
💰 通过 Bucket 生命周期规则自动清理过期文件(如:保留 30 天日志文件)
💡 提示:本方案经实际验证支持百万级文件并发上传,建议在企业级应用中结合 CDN 加速静态资源访问