若依微服务版集成阿里云oss

文章目录


前言

本文档详细介绍若依微服务版项目集成阿里云 OSS(对象存储服务)的完整流程,包括环境准备、代码实现、配置说明及功能验证。集成后,系统可通过阿里云 OSS 实现文件的上传存储,并支持生成公开访问 URL,适用于各类文件存储场景(如图片、文档等)。

(一)阿里云 OSS 资源准备

登录阿里云 OSS 控制台,创建专属 Bucket(存储空间),建议设置访问权限为 "public-read"(公开读私有写),确保文件上传后可通过 URL 直接访问。

获取访问密钥(AccessKey):登录阿里云控制台,进入 "访问控制 RAM" 页面,创建用于 OSS 访问的 AccessKeyId 和 AccessKeySecret,需记录该密钥对用于配置文件。

确认 OSS 地域与 Endpoint:根据 Bucket 所在地域,获取对应的 OSS Endpoint(例如华东 1 地域 Endpoint 为oss-cn-hangzhou.aliyuncs.com),可在阿里云 OSS 控制台的 Bucket 概览页查询。

(二)项目环境要求

若依微服务版框架(基于 Spring Cloud/Spring Boot)

JDK 1.8 及以上

Maven 3.6 及以上

阿里云 OSS Java SDK(项目将通过依赖自动引入)


一、集成步骤

在file模块相应包创建类

阿里云 OSS 配置属性类(AliyunOSSProperties.java)

用于绑定 Nacos 配置中心的 OSS 相关配置,封装 Endpoint、BucketName、AccessKey 等核心参数

java 复制代码
package com.manage.file.utils;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 阿里云OSS配置属性类
 * 绑定配置文件中前缀为 "aliyun.oss" 的配置项
 */
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
    // OSS服务端点(如:oss-cn-hangzhou.aliyuncs.com)
    private String endpoint;
    // 存储空间名称
    private String bucketName;
    // 地域(可选,部分场景需指定)
    private String region;
    // 访问密钥ID
    private String accessKeyId;
    // 访问密钥Secret
    private String accessKeySecret;

    // Getter和Setter方法
    public String getEndpoint() { return endpoint; }
    public void setEndpoint(String endpoint) { this.endpoint = endpoint; }
    public String getBucketName() { return bucketName; }
    public void setBucketName(String bucketName) { this.bucketName = bucketName; }
    public String getRegion() { return region; }
    public void setRegion(String region) { this.region = region; }
    public String getAccessKeyId() { return accessKeyId; }
    public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; }
    public String getAccessKeySecret() { return accessKeySecret; }
    public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; }
}

OSS 操作工具类(AliyunOSSOperator.java)

封装 OSS 文件上传核心逻辑,提供字节数组形式的文件上传方法,支持按日期分目录存储和 UUID 生成唯一文件名。

java 复制代码
package com.manage.file.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * 阿里云OSS操作工具类
 * 提供文件上传等核心操作方法
 */
@Component
public class AliyunOSSOperator {
    @Autowired
    private AliyunOSSProperties aliyunOSSProperties;

    /**
     * 上传字节数组内容到OSS
     * @param content 文件字节数组
     * @param originalFilename 原始文件名(用于获取文件后缀)
     * @return 上传后的文件公开访问URL
     * @throws Exception 上传过程中抛出的异常
     */
    public String upload(byte[] content, String originalFilename) throws Exception {
        // 获取OSS配置参数
        String endpoint = aliyunOSSProperties.getEndpoint();
        String bucketName = aliyunOSSProperties.getBucketName();
        String accessKeyId = aliyunOSSProperties.getAccessKeyId();
        String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();

        // 构建凭证提供者
        DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 创建OSS客户端(传统方式)
        OSS ossClient = new OSSClient(endpoint, credentialProvider, null);

        try {
            // 设置签名版本为V4(适配部分地域要求)
            System.setProperty("oss.signature.version", "v4");
            // 按日期分目录(格式:yyyy/MM)
            String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
            // 获取文件后缀(如:.jpg、.pdf)
            String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 生成唯一文件名(UUID+后缀,避免文件名重复)
            String newFileName = UUID.randomUUID() + ext;
            // 构建OSS中的文件路径(目录+文件名)
            String objectName = dir + "/" + newFileName;

            // 上传文件到OSS
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));

            // 构建公开访问URL(格式:https://bucketName.endpoint/objectName)
            return String.format("https://%s.%s/%s", bucketName, endpoint.replace("https://", ""), objectName);
        } finally {
            // 关闭OSS客户端,释放资源
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

OSS 文件服务实现类OssSysServiceImpl.java

实现 ISysFileService 接口,适配 MultipartFile 类型文件上传,调用 AliyunOSSProperties 获取配置,完成文件上传逻辑。

java 复制代码
package com.manage.file.service;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.manage.file.utils.AliyunOSSProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * 阿里云OSS文件上传服务实现类
 */
@Service
public class OssSysServiceImpl implements ISysFileService {
    @Autowired
    private AliyunOSSProperties aliyunOSSProperties;

    @Override
    public String uploadFile(MultipartFile file) throws Exception {
        // 校验文件是否为空
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("上传文件不能为空");
        }

        // 1. 获取OSS配置参数
        String endpoint = aliyunOSSProperties.getEndpoint();
        String bucketName = aliyunOSSProperties.getBucketName();
        String accessKeyId = aliyunOSSProperties.getAccessKeyId();
        String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();

        // 2. 构建OSS客户端(使用OSSClientBuilder)
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 3. 处理文件名与存储路径
            String originalFilename = file.getOriginalFilename();
            String ext = "";
            // 获取文件后缀
            if (originalFilename != null && originalFilename.contains(".")) {
                ext = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            // 生成唯一文件名(UUID去除横杠)
            String fileName = UUID.randomUUID().toString().replace("-", "") + ext;
            // 按日期分目录存储
            String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
            String objectName = dir + "/" + fileName;

            // 4. 上传文件到OSS(通过文件输入流上传)
            ossClient.putObject(bucketName, objectName, file.getInputStream());

            // 5. 构建并返回公开访问URL
            String host = endpoint.startsWith("https://") ? endpoint.substring(8) :
                          endpoint.startsWith("http://") ? endpoint.substring(7) : endpoint;
            return "https://" + bucketName + "." + host + "/" + objectName;
        } finally {
            // 关闭客户端,释放资源
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

配置默认文件服务

java 复制代码
package com.manage.file.config;

import com.manage.file.service.ISysFileService;
import com.manage.file.service.OssSysServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 默认文件服务配置
 * 指定OSS作为系统默认文件上传服务
 */
@Configuration
public class DefaultFileServiceConfig {
    @Bean
    @Primary
    public ISysFileService defaultFileService(OssSysServiceImpl ossSysService) {
        return ossSysService;
    }
}

编写文件上传控制器

修改 SysFileController.java,提供文件上传接口,接收前端 MultipartFile 类型文件,调用 OSS 服务完成上传并返回结果。

java 复制代码
package com.manage.file.controller;

import com.manage.common.core.domain.R;
import com.manage.common.core.utils.file.FileUtils;
import com.manage.file.service.ISysFileService;
import com.manage.file.service.OssSysServiceImpl;
import com.manage.system.api.domain.SysFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件上传控制器
 * 提供文件上传接口,对接前端上传请求
 */
@RestController
public class SysFileController {
    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);

    @Autowired
    private OssSysServiceImpl ossSysService;

    /**
     * 文件上传接口
     * @param file 前端上传的文件
     * @return R<SysFile> 响应结果(包含文件名称和访问URL)
     */
    @PostMapping("upload")
    public R<SysFile> ossupload(MultipartFile file) {
        try {
            // 调用OSS服务上传文件,获取访问URL
            String url = ossSysService.uploadFile(file);
            // 构建返回结果
            SysFile sysFile = new SysFile();
            sysFile.setName(FileUtils.getName(url)); // 从URL中提取文件名
            sysFile.setUrl(url); // 设置文件访问URL
            return R.ok(sysFile); // 返回成功响应
        } catch (Exception e) {
            // 打印异常日志,返回失败响应
            log.error("文件上传失败", e);
            return R.fail(e.getMessage());
        }
    }
}

配置 Nacos 参数

在ry-file-dev.yml

复制代码
aliyun:
  oss:
    endpoint: oss-cn-hangzhou.aliyuncs.com # 替换为你的OSS Endpoint
    bucketName: your-bucket-name # 替换为你的Bucket名称
    region: cn-hangzhou # 替换为你的Bucket地域
    accessKeyId: your-access-key-id # 替换为你的AccessKeyId
    accessKeySecret: your-access-key-secret # 替换为你的AccessKeySecret

依赖配置(pom.xml)

复制代码
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.17.4</version>
        </dependency>

总结

本文详细梳理了若依微服务版集成阿里云 OSS 的全流程,从前期资源准备到最终代码落地、配置验证,核心是通过封装 OSS 配置、实现文件服务接口、指定默认服务这三步,让若依框架无缝对接阿里云对象存储,实现文件的安全上传和公开访问。现将核心要点和落地关键总结如下:

核心流程复盘

前期准备是基础:需完成阿里云 OSS Bucket 创建、AccessKey 获取、Endpoint 确认,同时确保项目环境满足 JDK 1.8+、Maven 3.6 + 的要求,避免后续集成出现环境兼容问题。

代码实现是核心:通过AliyunOSSProperties绑定 Nacos 配置,OssSysServiceImpl实现若依默认ISysFileService接口,DefaultFileServiceConfig指定 OSS 为默认文件服务,最终通过SysFileController对外提供上传接口,形成完整的文件上传链路。

配置与验证是关键:在 Nacos 中配置 OSS 相关敏感参数(避免硬编码),引入阿里云 OSS SDK 依赖,最后通过 Postman 调用上传接口并验证文件访问 URL,确保整个集成流程落地生效。

关键注意事项提炼

安全优先:AccessKeyId/AccessKeySecret 是敏感信息,必须通过 Nacos 配置中心管理,生产环境建议使用 RAM 子账号并最小化授权(仅开放 OSS 相关操作权限),降低密钥泄露风险。

资源不泄漏:OSS 客户端使用完毕后必须调用shutdown()方法关闭,避免长期占用连接资源导致服务异常。

避免文件覆盖:通过「UUID + 日期目录」的方式构建文件存储路径,既保证了文件名唯一性,也方便后续对 OSS 中的文件进行分类管理和排查。

依赖版本兼容:本文使用3.17.4版本的阿里云 OSS SDK,落地时可根据项目 Spring Boot/Spring Cloud 版本选择兼容的 SDK 稳定版,避免版本冲突。

相关推荐
吨~吨~吨~3 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟3 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日3 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
码农水水3 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
summer_du3 小时前
IDEA插件下载缓慢,如何解决?
java·ide·intellij-idea
东东5163 小时前
高校智能排课系统 (ssm+vue)
java·开发语言
余瑜鱼鱼鱼3 小时前
HashTable, HashMap, ConcurrentHashMap 之间的区别
java·开发语言
php_kevlin3 小时前
阿里云AI接口接口
阿里云·云计算
SunnyDays10113 小时前
使用 Java 自动设置 PDF 文档属性
java·pdf文档属性
我是咸鱼不闲呀4 小时前
力扣Hot100系列16(Java)——[堆]总结()
java·算法·leetcode