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

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


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

  1. 配置阿里云OSS参数
    application.ymlapplication.properties中配置OSS参数:
yaml 复制代码
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
java 复制代码
@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类封装上传、下载等方法:
java 复制代码
@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测试接口
java 复制代码
@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的基本文件操作。

相关推荐
计算机学长felix18 分钟前
基于SpringBoot的“面向校园的助力跑腿系统”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·后端
紫荆鱼1 小时前
设计模式-迭代器模式(Iterator)
c++·后端·设计模式·迭代器模式
java水泥工2 小时前
课程答疑系统|基于SpringBoot和Vue的课程答疑系统(源码+数据库+文档)
spring boot·vue·计算机毕业设计·java毕业设计·大学生毕业设计·课程答疑系统
RainSky_2 小时前
LNMP 一键安装包部署 Django 项目
后端·django·1024程序员节
追逐时光者2 小时前
一个开源免费、轻量级的 Avalonia UI 控件库
后端·.net
间彧2 小时前
Java守护线程详解
后端
间彧2 小时前
Java Thread类源码详解与项目实战
后端
间彧2 小时前
🔍 Java Thread类全面解析与实战指南
后端
间彧2 小时前
Thread类的静态方法和实例方法详解、区别、应用场景、项目实战
后端
Captaincc3 小时前
AI 能帮你写代码,但把代码变成软件,还是得靠人
前端·后端·程序员