阿里云oss整合SpringBoot

阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。

您可以进行以下操作:

  • 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
  • 通过获取已上传文件的地址进行文件的分享和下载。
  • 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。
  • 在阿里云管理控制台执行基本和高级OSS任务。
  • 使用阿里云开发工具包或直接在应用程序中进行RESTful API调用执行基本和高级OSS任务
前期准备

1.直接搜索oss服务,第一次使用的话需要开通

地址 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

2.创建存储空间

新建Bucket,命名自己起

创建成功如下

注意 把读写改为公共读,否则无法访问

大概步骤如下

在yaml中引入依赖 安装OSS Java SDK_对象存储(OSS)-阿里云帮助中心

导入依赖

<!--阿里云OSS依赖-->
<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.10.2</version>
</dependency>
<!--支持配置属性类,yml文件中可以提示配置项-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

springboot启动时会把yml文件加载到2里面的类中AliOssProperties

由于都交给了bean容器所以能加载出来

1.设置yml里面的配置
# 阿里云oss
aliyun:
  oss:
    endpoint: https://xxxxxxxxxxx
    access-key-id: xxxxxxxxxx
    access-key-secret: xxxxxxxxxx
    bucket-name: xxxxxxxx

endpoint是你的地域地址

是指云存储服务的接入点,即您要连接的服务器地址。不同的区域(Region)会有不同的 endpoint

注意access-key-id access-key-secret千万不能泄露

access-key-id:

  • access-key-id 是一个标识符,用于唯一识别您的云账户。它是您与云服务进行身份验证的一部分。
  • 作用:当您向云存储服务发起请求时,access-key-id 用于告诉云服务“这是谁在发送请求”。它类似于用户名,但并不是直接用于登录的凭据,而是用于生成签名的一部分

access-key-secret:

  • 含义access-key-secret 是与 access-key-id 配对的秘密密钥,用于对请求进行签名,以确保请求的完整性和真实性。
  • 作用:每次您向云存储服务发送请求时,都需要使用 access-key-secret 来生成一个 HMAC-SHA1 或其他类型的签名。云服务会验证这个签名,以确认请求确实来自拥有该 access-key-id 的用户,并且请求内容未被篡改。

一定要保存好这对密钥

把这对密钥配置到yaml文件中即可

bucket-name:

你创建Bucket的名称

2.创建加载类

用于加载和管理阿里云 OSS(Object Storage Service)的相关配置属性。通过 @ConfigurationProperties 注解,可以将应用程序的配置文件(如 application.ymlapplication.properties)中的属性自动映射到 Java 类的字段中。这使得配置管理和依赖注入变得更加简洁和方便

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOssProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}
3.使用工具类
  • 功能:接收一个 MultipartFile 对象(即上传的文件),将其上传到阿里云 OSS,并返回文件的访问 URL。
  • 步骤
    1. 获取配置信息:从 AliOssProperties 中读取 OSS 的 endpointaccessKeyIdaccessKeySecretbucketName
    2. 文件大小校验:检查文件是否为空,以及文件大小是否超过预定义的最大值。如果文件不符合要求,抛出异常并阻止上传。
    3. 创建 OSS 客户端:使用 OSSClientBuilder 创建一个 OSS 客户端实例。
    4. 获取文件输入流:从 MultipartFile 中获取文件的输入流,准备上传。
    5. 生成唯一文件名:为了避免文件名冲突,使用 UUID 生成一个全局唯一的文件名,并保留原始文件的扩展名。
    6. 上传文件:调用 ossClient.putObject 方法将文件上传到指定的 OSS 存储桶。
    7. 生成文件访问 URL:上传成功后,调用 generateFileUrl 方法生成文件的访问 URL。
    8. 返回文件 URL:将生成的文件 URL 返回给调用者。
    9. 异常处理:捕获并处理可能发生的 I/O 异常和其他类型的异常。
    10. 关闭 OSS 客户端:无论上传是否成功,确保在 finally 块中关闭 OSS 客户端,释放资源。
@Component
public class AliOSSUtils {

    @Autowired
    private AliOssProperties aliOssProperties;

    // 限制最大文件大小(例如 10MB)
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取配置信息
        String endpoint = aliOssProperties.getEndpoint();
        String accessKeyId = aliOssProperties.getAccessKeyId();
        String accessKeySecret = aliOssProperties.getAccessKeySecret();
        String bucketName = aliOssProperties.getBucketName();

        // 检查文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }

        // 检查文件大小是否超过限制
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new IllegalArgumentException("文件大小超过限制(" + MAX_FILE_SIZE / (1024 * 1024) + "MB)");
        }

        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            // 获取上传的文件的输入流
            InputStream inputStream = file.getInputStream();

            // 避免文件覆盖
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null) {
                throw new IllegalArgumentException("文件名不能为空");
            }
            String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

            // 上传文件到 OSS
            ossClient.putObject(bucketName, fileName, inputStream);

            // 文件访问路径
            String url = generateFileUrl(fileName);
            return url; // 把上传到oss的路径返回

        } catch (IOException e) {
            throw new IOException("文件上传失败: " + e.getMessage(), e);
        } catch (Exception e) {
            throw new RuntimeException("文件上传过程中发生错误: " + e.getMessage(), e);
        } finally {
            // 关闭 OSS 客户端
            ossClient.shutdown();
        }
    }

    /**
     * 生成文件的访问 URL
     */
    private String generateFileUrl(String fileName) {
        String endpoint = aliOssProperties.getEndpoint();
        String bucketName = aliOssProperties.getBucketName();

        // 如果 endpoint 包含协议(如 http:// 或 https://),则直接使用
        if (endpoint.startsWith("http://") || endpoint.startsWith("https://")) {
            return String.format("%s/%s", endpoint, fileName);
        } else {
            // 如果 endpoint 不包含协议,则默认使用 https
            return String.format("https://%s.%s/%s", bucketName, endpoint, fileName);
        }
    }
}

controller

@RestController
@RequestMapping("/api")
public class FileUploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    /**
     * 处理文件上传请求
     */
    @PostMapping("/upload")
    public BaseResponse<String> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 调用 AliOSSUtils 的 upload 方法上传文件
            String url = aliOSSUtils.upload(file);
            return ResultUtils.success(url);
        } catch (IOException e) {
            // 捕获并处理上传过程中可能发生的 I/O 异常
            return null;
        } catch (Exception e) {
            // 捕获并处理其他类型的异常
            return null;
        }
    }
}

使用knife4j接口文档访问后端地址测试即可

去阿里云oss查看是否上传成功

还可进一步简化 参考X File Storage官方文档即可,这里不做赘述

X File Storage

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值