ys 1dfd073160 1 6 kuukautta sitten
..
OSSConfig.java e20d500e22 first commit 6 kuukautta sitten
OSSService.java e20d500e22 first commit 6 kuukautta sitten
README.md 1dfd073160 1 6 kuukautta sitten
yml配置.txt e20d500e22 first commit 6 kuukautta sitten

README.md

阿里云OSS对象存储工具

📋 工具概述

这是一个基于阿里云OSS(Object Storage Service)对象存储服务的Java工具包,提供了完整的文件上传、下载、删除和URL生成功能。该工具使用Spring Boot框架,支持配置化管理,适合在企业级应用中使用。

✨ 主要功能

  • 🔄 文件上传: 支持MultipartFile文件上传到阿里云OSS
  • 📥 文件下载: 从OSS下载文件并返回输入流
  • 🔗 预签名URL: 生成带有时效性的文件访问链接
  • 🗑️ 文件删除: 安全删除OSS中的文件
  • ⚙️ 配置管理: 通过YAML配置文件管理OSS连接参数

📂 文件结构

阿里oss云存储/
├── README.md           # 本说明文档
├── OSSService.java     # OSS服务核心实现类
├── OSSConfig.java      # OSS配置类,用于读取配置文件
└── yml配置.txt         # 配置文件模板

🔧 配置说明

1. 依赖配置

在你的 pom.xml 中添加以下依赖:

<!-- 阿里云OSS SDK -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

<!-- Spring Boot配置处理器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

<!-- Lombok(用于简化代码) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2. YAML配置

在你的 application.yml 文件中添加以下配置:

# 阿里云OSS配置
aliyun:
  oss:
    # OSS访问端点(根据你的地域选择)
    endpoint: oss-cn-guangzhou.aliyuncs.com  # 广州节点
    # 访问密钥ID(从阿里云控制台获取)
    access-key-id: YOUR_ACCESS_KEY_ID
    # 访问密钥Secret(从阿里云控制台获取)
    access-key-secret: YOUR_ACCESS_KEY_SECRET
    # 存储桶名称
    bucket-name: YOUR_BUCKET_NAME
    # 默认URL有效期(秒)
    default-expiration: 604800  # 7天

⚠️ 安全提醒:

  • 不要将真实的密钥直接写在配置文件中
  • 建议使用环境变量或加密配置管理敏感信息

📋 核心类说明

OSSConfig.java - 配置类

@Component
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
public class OSSConfig {
    private String endpoint;          // OSS访问端点
    private String accessKeyId;       // 访问密钥ID
    private String accessKeySecret;   // 访问密钥Secret
    private String bucketName;        // 存储桶名称
    private int defaultExpiration = 3600; // 默认过期时间
}

OSSService.java - 服务类

这是核心服务类,提供以下主要方法:

1. 文件上传

/**
 * 上传文件到OSS
 * @param objectName OSS中的文件路径/文件名
 * @param file 要上传的MultipartFile文件
 * @return 文件的预签名访问URL,失败时返回null
 */
public String uploadFile(String objectName, MultipartFile file)

2. 文件下载

/**
 * 从OSS下载文件
 * @param objectName OSS中的文件路径
 * @return 文件的输入流
 * @throws IOException 下载失败时抛出异常
 */
public InputStream downloadFile(String objectName) throws IOException

3. 生成预签名URL

/**
 * 生成预签名URL(使用默认有效期)
 * @param objectName OSS中的文件路径
 * @return 带有时效性的文件访问URL
 */
public String generatePresignedUrl(String objectName)

/**
 * 生成预签名URL(自定义有效期)
 * @param objectName OSS中的文件路径
 * @param expirationSeconds 有效期(秒)
 * @return 带有时效性的文件访问URL
 */
public String generatePresignedUrl(String objectName, int expirationSeconds)

4. 文件删除

/**
 * 删除OSS中的文件
 * @param objectName OSS中的文件路径
 * @return true表示删除成功,false表示删除失败
 */
public boolean deleteFile(String objectName)

🚀 使用示例

在Controller中使用

@RestController
@RequestMapping("/api/file")
public class FileController {
    
    @Autowired
    private OSSService ossService;
    
    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body("文件不能为空");
        }
        
        // 生成唯一的文件名(可以加上时间戳避免重名)
        String objectName = "uploads/" + System.currentTimeMillis() + "_" + file.getOriginalFilename();
        
        // 上传文件并获取访问URL
        String fileUrl = ossService.uploadFile(objectName, file);
        
        if (fileUrl != null) {
            return ResponseEntity.ok("文件上传成功,访问链接: " + fileUrl);
        } else {
            return ResponseEntity.status(500).body("文件上传失败");
        }
    }
    
    /**
     * 下载文件
     */
    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile(@RequestParam("filename") String filename) {
        try {
            InputStream inputStream = ossService.downloadFile(filename);
            InputStreamResource resource = new InputStreamResource(inputStream);
            
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"")
                    .body(resource);
        } catch (IOException e) {
            return ResponseEntity.status(404).body(null);
        }
    }
    
    /**
     * 获取文件访问链接
     */
    @GetMapping("/url")
    public ResponseEntity<String> getFileUrl(@RequestParam("filename") String filename) {
        String url = ossService.generatePresignedUrl(filename);
        return ResponseEntity.ok("文件访问链接: " + url);
    }
    
    /**
     * 删除文件
     */
    @DeleteMapping("/delete")
    public ResponseEntity<String> deleteFile(@RequestParam("filename") String filename) {
        boolean success = ossService.deleteFile(filename);
        if (success) {
            return ResponseEntity.ok("文件删除成功");
        } else {
            return ResponseEntity.status(500).body("文件删除失败");
        }
    }
}

🔍 功能特点

1. 自动资源管理

  • 使用 @PreDestroy 注解确保应用关闭时正确释放OSS客户端资源
  • 在文件操作中使用 try-with-resources 确保输入流正确关闭

2. 异常处理

  • 完善的异常捕获和处理机制
  • 详细的错误日志输出,便于问题排查

3. 配置化管理

  • 支持通过YAML配置文件管理所有OSS连接参数
  • 支持自定义默认过期时间

4. 灵活的URL生成

  • 支持使用默认过期时间生成预签名URL
  • 支持自定义过期时间,满足不同业务需求

⚠️ 注意事项

  1. 权限配置: 确保你的阿里云账户有足够的OSS操作权限
  2. 存储桶策略: 根据需要配置存储桶的读写权限
  3. 文件命名: 建议使用有意义的文件路径和名称,便于管理
  4. 大文件上传: 对于大文件,建议使用分片上传功能(可后续扩展)
  5. 成本控制: 注意OSS的存储和流量费用

🔧 扩展建议

  1. 分片上传: 对于大文件,可以添加分片上传功能
  2. 图片处理: 可以集成阿里云的图片处理服务
  3. CDN加速: 结合阿里云CDN提高文件访问速度
  4. 监控告警: 添加文件操作的监控和告警功能

📞 技术支持

如果在使用过程中遇到问题,可以:

  1. 查看阿里云OSS官方文档
  2. 检查配置文件是否正确
  3. 查看应用日志中的详细错误信息

最后更新: 2024年 兼容版本: Spring Boot 2.x+, Java 8+