SpringBoot后端实现阿里云oss上传文件

(个人学习记录)

具体的开通阿里云oss在这里就不进行演示了。

一、创建一个bucket

这里我们直接快速创建一个。

点击快速创建,输入自己的bucket名称。

点击完成创建。

可以通过下面的图片看到,这里已经创建成功了。

二、我们创建AccessKey 获取AccessKey Secret 。

点击如下创建按钮进行创建,创建成功后会获取到AccessKey和AccessKey Secret。要记住AccessKey Secret。因为我已经有2个AccessKey了,所以好像不能创建了。

三、java后端通过代码进行上传

进行依赖的导入

XML 复制代码
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.0</version> <!-- 可根据实际情况选择合适版本,到Maven中央仓库查看最新版本 -->
</dependency>

在yml文件里面进行oss的配置:

java 复制代码
# OSS 配置
aliyun:
  oss:
    # 访问密钥 ID(必填,从阿里云控制台获取)
    access-key-id: LTAI******************  # 替换为你的 AccessKeyId
    # 访问密钥 Secret(必填,从阿里云控制台获取)
    access-key-secret: i************************  # 替换为你的 AccessKeySecret
    # OSS 地域节点 Endpoint(必填,例如:华东 1 为 oss-cn-hangzhou.aliyuncs.com)
    endpoint: oss-cn-hangzhou.aliyuncs.com # 替换为你的 Endpoint
    # Bucket 名称(必填,存储文件的容器名称)
    bucket-name: hangyuli  # 替换为你的 Bucket 名称
    # 访问文件的基础路径(可选,通常为 Bucket 对应的域名或 CDN 域名,用于拼接文件 URL)
    url-prefix: https://hangyuli.oss-cn-hangzhou.aliyuncs.com  # 可选,根据实际情况填写
   

#设置上传文件的大小
spring:
  servlet:
    multipart:
      max-file-size: 10MB    # 单个文件最大大小(可根据需求调整,如 50MB、100MB)
      max-request-size: 100MB # 单次请求所有文件的总大小(需大于等于 max-file-size)

创建一个oss的工具类:OssUtil类

我们在OssUtil类里面进行上传文件的逻辑代码编写。

java 复制代码
package org.example.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Component
@ConfigurationProperties(prefix = "aliyun.oss") // 绑定配置前缀
public class OssUtil {

    // 从配置文件注入参数
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String urlPrefix;

    // OSS客户端(全局单例)
    private OSS ossClient;

    // 初始化OSS客户端(项目启动时执行)
    @PostConstruct
    public void init() {
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 上传文件到OSS
     * @param file 待上传的文件(MultipartFile)
     * @param folder 上传到OSS的文件夹路径(如 "images/")
     * @return 上传后的文件URL
     */
    public String upload(MultipartFile file, String folder) throws IOException {
        // 1. 获取原始文件名,提取后缀(如 "jpg")
        String originalFilename = file.getOriginalFilename();
        System.out.println("原始文件名:" + originalFilename);
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        System.out.println("文件后缀:" + suffix);
        // 2. 生成唯一文件名(避免重名覆盖)
        String fileName = folder + UUID.randomUUID().toString() + suffix;
        System.out.println("最终文件名:" + fileName);
        // 3. 获取文件输入流,上传到OSS
        try (InputStream inputStream = file.getInputStream()) {
            ossClient.putObject(bucketName, fileName, inputStream);
        }

        // 4. 返回文件访问URL(拼接前缀 + 文件名)
        return urlPrefix + "/"+fileName;
    }

    /**
     * 删除OSS上的文件
     * @param filePath 文件在OSS中的完整路径(如 "images/uuid.jpg")
     */
    public void delete(String filePath) {
        ossClient.deleteObject(bucketName, filePath);
    }

    // Getter和Setter(必须,否则@ConfigurationProperties无法绑定)
    public void setEndpoint(String endpoint) { this.endpoint = endpoint; }
    public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; }
    public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; }
    public void setBucketName(String bucketName) { this.bucketName = bucketName; }
    public void setUrlPrefix(String urlPrefix) { this.urlPrefix = urlPrefix; }
}

创建一个controller来进行请求的处理:

java 复制代码
 @Autowired
    private OssUtil ossUtil;

    /**
     * 处理文件上传请求
     * @param file 前端上传的文件
     * @return 上传结果(包含文件URL)
     */
    @PostMapping("/upload")
    public Map<String, Object> uploadFile(@RequestParam("file") MultipartFile file) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 上传到OSS的"images/"文件夹下
            String fileUrl = ossUtil.upload(file, "images/");
            result.put("success", true);
            result.put("url", fileUrl); // 返回文件访问URL
        } catch (IOException e) {
            result.put("success", false);
            result.put("message", "上传失败:" + e.getMessage());
        }
        return result;
    }

最后进行测试检验是否成功:

我们启动该程序,通过apifox来发送请求,看是否能成功上传文件:

选择post请求,在请求体里面选择form-data,填入参数名称和选择要上传的文件,我这里选择的是一个视频文件。(不要超过我们设置的最大上传文件大小,不然会报错),如果成功返回地址,那么就上传成功。

从下面的图片可以看到,已经上传成功了

apifox也已经成功返回了文件的存储地址

我们进入到ossl里面进行查看

可以看到文件已经成功上传了。

相关推荐
Database_Cool_2 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库
Database_Cool_4 小时前
数据库性能不够用,升级到什么方案好?阿里云 PolarDB(云原生数据库领导者,兼容 MySQL/PostgreSQL/Oracle)平滑升级与百倍弹性
数据库·阿里云·云原生
Database_Cool_8 小时前
阿里云 PolarDB-X vs TiDB 分布式数据库选型指南
数据库·分布式·阿里云·tidb
Database_Cool_21 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
胖胖雕1 天前
利用阿里云与docker部署Certimate
阿里云·docker·云计算
Database_Cool_1 天前
阿里云 RDS MySQL vs 腾讯云 CDB 国内云关系型数据库深度对比
数据库·mysql·阿里云
AliCloudROS1 天前
一次真实录屏:我只说每月别超过 200 块,小程序后端就搭好了
运维·人工智能·云计算
Database_Cool_1 天前
阿里云 PolarDB-X vs OceanBase 国产分布式数据库深度对比
分布式·阿里云·oceanbase
buligbulig1 天前
如何在云计算中使用虚拟磁盘?
云计算
赛博三把手2 天前
Claude Fable 5 API 调用完整指南:官方、AWS、OpenRouter 与中转平台对比(2026 最新)
网络·云计算·aws