springboot使用阿里云OSS实现文件上传
在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-idaccess-key-secret: your-access-key-secretbucket-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;@Beanpublic OSS ossClient() {return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}
}
- 实现OSS服务工具类
创建AliOssUtil类封装上传、下载等方法:
@Component
@Slf4j
public class AliOssUtil {private final AliOssConfig aliOssConfig;private OSS ossClient;@Autowiredpublic 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);}// 返回 URLreturn 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 {@Autowiredprivate 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的基本文件操作。