对象存储(OSS) 是一种用于存储非结构化数据(如图片、视频、日志文件)的云服务,核心功能包括:
阿里云OSS的优势:
典型应用场景:
2.1 注册阿里云并开通OSS
2.2 创建Bucket
myapp-images
)。2.3 获取AccessKey
AccessKey ID
和 AccessKey Secret
(仅显示一次)。3.1 创建项目
使用 Spring Initializr 生成项目,勾选:
3.2 添加依赖
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
<version>3.16.1version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
3.3 配置参数
# application.properties
# OSS配置
aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=your-access-key-id
aliyun.oss.accessKeySecret=your-access-key-secret
aliyun.oss.bucketName=myapp-images
4.1 封装OSS工具类
@Configuration
public class OssConfig {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
@Bean
public OSS ossClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
@Service
public class OssService {
@Autowired
private OSS ossClient;
@Autowired
private String bucketName;
// 上传文件
public String uploadFile(MultipartFile file, String path) throws IOException {
String fileName = path + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(file.getBytes()));
return fileName;
}
// 生成文件访问URL(私有Bucket需签名)
public String getFileUrl(String fileName) {
return "https://" + bucketName + "." + endpoint + "/" + fileName;
}
// 删除文件
public void deleteFile(String fileName) {
ossClient.deleteObject(bucketName, fileName);
}
}
4.2 文件上传接口
@RestController
@RequestMapping("/api/oss")
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
try {
String fileName = ossService.uploadFile(file, "avatars");
return ResponseEntity.ok(ossService.getFileUrl(fileName));
} catch (IOException e) {
return ResponseEntity.status(500).body("上传失败");
}
}
}
4.3 前端上传示例(Axios)
// 前端代码
const fileInput = document.getElementById('file-input');
const formData = new FormData();
formData.append('file', fileInput.files[0]);
axios.post('/api/oss/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
}).then(response => {
console.log('文件访问地址:', response.data);
});
5.1 分块上传(适合大文件)
public String uploadBigFile(File file, String path) {
String fileName = path + "/" + file.getName();
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileName);
InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
String uploadId = result.getUploadId();
// 分块上传逻辑(略)
// ...
ossClient.completeMultipartUpload(new CompleteMultipartUploadRequest(
bucketName, fileName, uploadId, partETags
));
return fileName;
}
5.2 图片处理(生成缩略图)
public String getThumbnailUrl(String fileName) {
String style = "image/resize,w_100"; // 缩放到宽度100px
return getFileUrl(fileName) + "?x-oss-process=" + style;
}
6.1 STS临时凭证
// 生成临时Token(需配置RAM角色)
public STSAssumeRoleSessionCredentials getSTSCredentials() {
STSAssumeRoleSessionCredentials credentials = new STSAssumeRoleSessionCredentials(
"your-access-key-id",
"your-access-key-secret",
"your-role-arn",
"session-name"
);
return credentials;
}
6.2 HTTPS强制加密
在Bucket配置中开启 强制HTTPS访问:
7.1 自动配置优化
@Configuration
@EnableConfigurationProperties(OssProperties.class) // 自定义属性类
public class OssAutoConfig {
// 自动注入OSSClient
}
7.2 结合Spring Security控制上传权限
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/oss/upload").hasRole("ADMIN")
.anyRequest().permitAll();
}
}
问题1:AccessKey无效
问题2:上传超时
// 配置OSSClient超时参数
ClientBuilderConfiguration config = new ClientBuilderConfiguration();
config.setConnectionTimeout(30 * 1000); // 30秒
OSS client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, config);
问题3:文件无法下载
应用场景:
扩展学习:
流程图:文件上传流程
避坑指南:
立即行动:
让阿里云OSS为您的应用提供稳定高效的对象存储服务!