使用阿里云 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>
<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) { String endpoint = "https://oss-cn-beijing.aliyuncs.com"; String bucketName = "your-bucket-name"; String objectName = "demo.jpg"; OSS ossClient = new OSSClientBuilder() .build(endpoint, new EnvironmentVariableCredentialsProvider()); try { 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 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| 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; private String bucketName; private String region; } ````
#### 上传工具类(封装核心操作)
```java 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) { 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)); 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;
}
|
🎯 4. 优化策略
配置管理方案对比
| 方案 |
优点 |
缺点 |
| @Value 注解 |
简单直接,适合少量配置 |
配置分散在代码中,维护成本高 |
| @ConfigurationProperties |
集中管理在 YAML 文件,类型安全 |
需要创建独立配置类 |
推荐配置方式(YAML 集中管理)
1 2 3 4 5 6
| aliyun: oss: endpoint: https://oss-cn-beijing.aliyuncs.com bucketName: production-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 加速静态资源访问