阿里云OSS文件上传完整实现方案

发布于:2025-06-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、前言

阿里云对象存储服务(OSS)是一种海量、安全、低成本、高可靠的云存储服务。本文将详细介绍如何在Spring Boot项目中集成阿里云OSS实现文件上传功能。

二、准备工作

1. 获取OSS配置信息

在开始前,您需要准备以下OSS配置信息:

  • endpoint: OSS服务访问端点

  • access-key-id: 访问密钥ID

  • access-key-secret: 访问密钥

  • bucket-name: 存储空间名称

获取方法参考:阿里云OSS配置获取指南

三、项目集成

1. 添加Maven依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.0</version> 
</dependency>

2. 配置application.yml

survey:
  alioss:
    endpoint: your-endpoint
    access-key-id: your-access-key-id
    access-key-secret: your-access-key-secret
    bucket-name: your-bucket-name

四、核心代码实现

1. 属性配置类

@Component
@ConfigurationProperties(prefix = "survey.alioss")
@Data
public class AliOssProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

2. OSS工具类

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    public String upload(byte[] bytes, String objectName) {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            log.error("OSS异常: {}", oe.getMessage());
        } catch (ClientException ce) {
            log.error("客户端异常: {}", ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        // 构建文件访问URL
        String fileUrl = String.format("https://%s.%s/%s", 
            bucketName, endpoint, objectName);
        log.info("文件上传到: {}", fileUrl);
        return fileUrl;
    }
}

3. 配置类

@Configuration
@Slf4j
public class OssConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {
        log.info("创建阿里云文件上传工具类对象");
        return new AliOssUtil(
            aliOssProperties.getEndpoint(),
            aliOssProperties.getAccessKeyId(),
            aliOssProperties.getAccessKeySecret(),
            aliOssProperties.getBucketName());
    }
}

4. 文件上传接口

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    @Autowired
    private AliOssUtil aliOssUtil;

    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file) {
        log.info("文件上传: {}", file.getOriginalFilename());

        try {
            String originalFileName = file.getOriginalFilename();
            String extension = originalFileName.substring(originalFileName.lastIndexOf("."));
            String objectName = UUID.randomUUID().toString() + extension;

            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            return Result.success(filePath);
        } catch (IOException e) {
            log.error("文件上传失败: {}", e.getMessage());
            return Result.error("文件上传失败");
        }
    }
}

五、功能说明

  1. 文件命名:使用UUID生成唯一文件名,避免文件名冲突

  2. 异常处理:捕获OSSException和ClientException,记录详细错误日志

  3. 资源释放:确保OSSClient在使用后被正确关闭

  4. URL生成:按照阿里云OSS规范生成文件访问URL

六、使用示例

前端可以通过表单提交文件到/common/upload接口,接口会返回文件的访问URL。

七、注意事项

  1. 确保阿里云OSS服务已开通

  2. AccessKey需要妥善保管,不要泄露

  3. 上传大文件时考虑使用分片上传

  4. 生产环境建议添加文件大小限制和类型检查

八、总结

本文详细介绍了Spring Boot集成阿里云OSS实现文件上传的完整方案,包括配置获取、工具类封装和接口实现。该方案具有以下优点:

  • 代码结构清晰,易于维护

  • 完善的异常处理机制

  • 可扩展性强,便于添加新功能

希望本文对您有所帮助,欢迎在评论区交流讨论。