在Spring Boot中集成阿里云OSS(对象存储服务)可以通过以下步骤实现:
- 添加Maven依赖
在pom.xml
中添加阿里云OSS SDK依赖:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.16.1</version>
</dependency>
- 配置阿里云OSS参数
在application.yml
或application.properties
中配置OSS参数:
aliyun:
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com # 根据实际填写(注意这个地方,不要带包名)
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
bucket-name: your-bucket-name
- 创建OSS配置类
创建OSSConfig
类读取配置并初始化OSSClient
:
@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);
}
}
- 实现OSS服务工具类
创建AliOssUtil类封装上传、下载等方法:
@Component
@Slf4j
public class AliOssUtil {
private final AliOssConfig aliOssConfig;
private OSS ossClient;
@Autowired
public AliOssUtil(AliOssConfig aliOssConfig) {
this.aliOssConfig = aliOssConfig;
ossClient = new OSSClientBuilder().build(aliOssConfig.getEndpoint(), aliOssConfig.getAccessKeyId(), aliOssConfig.getAccessKeySecret());
}
public String uploadFile(MultipartFile file) {
if (file.isEmpty()) {
throw new IllegalArgumentException("文件不能为空");
}
try {
// 生成文件名和路径
String fileName = generateUniqueFileName(file.getOriginalFilename());
String filePath = generateDateBasedFilePath(fileName);
// 上传文件
try (InputStream inputStream = file.getInputStream()) {
ossClient.putObject(aliOssConfig.getBucketName(), filePath, inputStream);
}
// 返回 URL
return buildOssUrl(filePath);
} catch (IOException e) {
throw new RuntimeException("文件读取失败: " + e.getMessage());
} catch (OSSException | ClientException e) {
throw new RuntimeException("OSS服务异常: " + e.getMessage());
}
}
/**
* 生成唯一文件名(UUID + 扩展名)
*/
private String generateUniqueFileName(String originalFilename) {
String extension = getFileExtension(originalFilename);
return UUID.randomUUID() + extension;
}
/**
* 提取文件扩展名(处理无扩展名的情况)
*/
private String getFileExtension(String originalFilename) {
if (originalFilename == null) return ".dat";
int lastDotIndex = originalFilename.lastIndexOf(".");
return (lastDotIndex == -1) ? ".dat" : originalFilename.substring(lastDotIndex);
}
/**
* 生成基于日期的存储路径(如 images/2024/06/15/uuid.jpg)
*/
private String generateDateBasedFilePath(String fileName) {
String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
return String.format("images/%s/%s", datePath, fileName);
}
/**
* 构建 OSS 访问 URL
*/
private String buildOssUrl(String filePath) {
return String.format("https://%s.%s/%s",
aliOssConfig.getBucketName(),
aliOssConfig.getEndpoint(),
filePath);
}
/**
* 删除文件
*/
public void deleteFile(String filePath) {
ossClient.deleteObject(aliOssConfig.getBucketName(), filePath);
}
}
- 创建Controller测试接口
@RestController
@RequestMapping("/oss")
public class OSSController {
@Autowired
private OSSService ossService;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
try {
return ossService.uploadFile(file);
} catch (IOException e) {
return "上传失败: " + e.getMessage();
}
}
@DeleteMapping("/delete")
public String delete(@RequestParam String filePath) {
ossService.deleteFile(filePath);
return "删除成功";
}
}
- 注意事项
- 权限管理:确保Bucket的读写权限(ACL)设置为允许当前操作。
- 异常处理:建议对OSS操作添加
try-catch
,处理网络异常或认证失败等情况。 - 客户端关闭:在Spring Bean生命周期结束时关闭OSSClient(需在配置类中添加
@PreDestroy
方法)。 - 文件名唯一性:建议使用UUID或时间戳生成唯一文件名,避免覆盖。
- 扩展功能
• 分片上传:使用ossClient.initiateMultipartUpload
处理大文件分片上传。
• STS临时凭证:通过STS服务获取临时Token,提升安全性。
• CDN加速:如果启用了CDN,可直接返回CDN域名而非OSS域名。
通过以上步骤,即可在Spring Boot中实现阿里云OSS的基本文件操作。