springboot使用阿里云OSS实现文件上传

发布于:2025-05-09 ⋅ 阅读:(17) ⋅ 点赞:(0)

在Spring Boot中集成阿里云OSS(对象存储服务)可以通过以下步骤实现:


  1. 添加Maven依赖
    pom.xml中添加阿里云OSS SDK依赖:
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.16.1</version>
</dependency>

  1. 配置阿里云OSS参数
    application.ymlapplication.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

  1. 创建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);
    }
}

  1. 实现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);
    }
}    

  1. 创建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 "删除成功";
    }
}

  1. 注意事项
  2. 权限管理:确保Bucket的读写权限(ACL)设置为允许当前操作。
  3. 异常处理:建议对OSS操作添加try-catch,处理网络异常或认证失败等情况。
  4. 客户端关闭:在Spring Bean生命周期结束时关闭OSSClient(需在配置类中添加@PreDestroy方法)。
  5. 文件名唯一性:建议使用UUID或时间戳生成唯一文件名,避免覆盖。

  1. 扩展功能
    • 分片上传:使用ossClient.initiateMultipartUpload处理大文件分片上传。

• STS临时凭证:通过STS服务获取临时Token,提升安全性。

• CDN加速:如果启用了CDN,可直接返回CDN域名而非OSS域名。


通过以上步骤,即可在Spring Boot中实现阿里云OSS的基本文件操作。


网站公告

今日签到

点亮在社区的每一天
去签到