文章目录
一、什么是阿里云OSS?
1.1 核心功能特性
阿里云对象存储OSS(Object Storage Service) 是阿里云提供的海量、安全、低成本、高持久的云存储服务。适用于存储非结构化数据(如图片、音视频、日志等),具备以下优势:
- 99.9999999999%数据可靠性(12个9)
- 全球加速访问,支持CDN内容分发
- 精细化权限控制(Bucket Policy、STS临时授权)
- 无缝对接阿里云生态(ECS、函数计算、大数据分析)
1.2 核心概念说明
- Bucket:存储文件的容器(类似文件夹)
- Object:存储的基本单元(文件及其元数据)
- Region:数据中心所在区域(如oss-cn-beijing)
- Endpoint:Bucket的外网访问域名
二、快速开通OSS服务
2.1 创建Bucket
- 登录阿里云控制台,进入OSS管理页面
- 点击创建Bucket → 输入名称(如
myapp-bucket
) - 选择Region(建议与ECS同区域)→ 设置读写权限为公共读(测试用)
参考官方文档:创建Bucket
2.2 获取访问密钥
- 鼠标悬停右上角头像 → 进入AccessKey管理
- 创建AccessKey(保存AccessKey ID和Secret)
⚠️ 警告:SecretKey仅显示一次,务必妥善保管
三、SpringBoot集成OSS SDK
3.1 添加Maven依赖
<!-- 阿里云OSS SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.0</version>
</dependency>
<!-- 简化HTTP请求处理 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
3.2 配置application.yml
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com # 替换为你的Endpoint
access-key-id: your-access-key-id # 替换为你的AK
access-key-secret: your-access-key-secret
bucket-name: myapp-bucket
url-expire-time: 3600 # 临时URL有效期(秒)
3.3 初始化OSS客户端
@Configuration
public class OssConfig {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.access-key-id}")
private String accessKeyId;
@Value("${aliyun.oss.access-key-secret}")
private String accessKeySecret;
@Bean
public OSS ossClient() {
return new OSSClientBuilder()
.build(endpoint, accessKeyId, accessKeySecret);
}
}
四、核心功能实现
4.1 文件上传工具类
@Service
@Slf4j
public class OssService {
@Autowired
private OSS ossClient;
@Value("${aliyun.oss.bucket-name}")
private String bucketName;
@Value("${aliyun.oss.url-expire-time}")
private Long expireTime;
/**
* 上传文件并返回访问URL
* @param file 上传文件
* @param path 存储路径(如 "avatar/")
*/
public String upload(MultipartFile file, String path) throws IOException {
String fileName = path + UUID.randomUUID()
+ file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf("."));
ossClient.putObject(bucketName, fileName,
new ByteArrayInputStream(file.getBytes()));
// 生成带签名的访问URL(防止盗链)
Date expiration = new Date(System.currentTimeMillis() + expireTime * 1000);
URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);
return url.toString();
}
/**
* 删除文件
* @param fileUrl 文件完整URL
*/
public void delete(String fileUrl) {
String fileName = fileUrl.substring(
fileUrl.lastIndexOf("/") + 1);
ossClient.deleteObject(bucketName, fileName);
}
}
4.2 文件上传接口示例
@RestController
@RequestMapping("/oss")
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("/upload")
public Result<String> uploadFile(@RequestParam("file") MultipartFile file,
@RequestParam(defaultValue = "temp/") String path) {
try {
String url = ossService.upload(file, path);
return Result.success("上传成功", url);
} catch (IOException e) {
return Result.fail("上传失败:" + e.getMessage());
}
}
@DeleteMapping("/delete")
public Result<Void> deleteFile(@RequestParam String url) {
ossService.delete(url);
return Result.success("删除成功");
}
}
五、安全最佳实践
5.1 避免AK泄露
- 方案一:使用RAM子账号,授予最小权限
- 方案二:通过STS获取临时Token(推荐移动端使用)
// STS临时授权示例
AssumeRoleRequest request = new AssumeRoleRequest()
.setRoleArn("acs:ram::1234567890:role/admin")
.setRoleSessionName("session-name");
AssumeRoleResponse response = client.assumeRole(request);
String securityToken = response.getCredentials().getSecurityToken();
5.2 防盗链设置
在Bucket的基础设置 → 防盗链中添加白名单域名:
http://*.yourdomain.com
https://*.yourdomain.com
六、常见问题排查
6.1 403 Forbidden错误
- 原因:AK权限不足/Bucket权限未开放
- 解决:检查RAM权限策略或临时调整Bucket ACL
6.2 文件URL过期失效
- 现象:生成的URL在一段时间后无法访问
- 解决:调整url-expire-time或使用永久公开读(不推荐)
6.3 上传大文件超时
-
优化:使用分片上传API(建议超过100MB时启用)
// 初始化分片上传 InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName); InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request); String uploadId = result.getUploadId();
总结
通过本文,我们完成了SpringBoot与阿里云OSS的深度整合,实现了安全的云端文件存储能力。相比自建文件服务器,OSS提供了更高的可靠性和弹性扩展能力。后续可结合图片处理、日志分析等功能释放更多业务价值。