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里面进行查看

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

相关推荐
孤岛悬城17 小时前
37 日志分析:ELK(Elasticsearch+Logstash+Kibana)
云计算
主机哥哥19 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
珠海西格电力科技20 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
Sheffield1 天前
command和shell模块到底区别在哪?
linux·云计算·ansible
Hello.Reader1 天前
Flink 对接阿里云 OSS(Object Storage Service)读写、Checkpoint、插件安装与配置模板
大数据·阿里云·flink
DolitD1 天前
云流技术深度剖析:国内云渲染主流技术与开源和海外厂商技术实测对比
功能测试·云原生·开源·云计算·实时云渲染
翼龙云_cloud1 天前
阿里云渠道商:阿里云 ECS 从安全组到云防火墙的实战防护指南
安全·阿里云·云计算
YongCheng_Liang1 天前
从零开始学虚拟化:桌面虚拟化(VDI)入门指南(架构 + 产品 + 部署)
运维·云计算
万物得其道者成1 天前
阿里云 H5 一键登录接入实战:前后端完整实现
阿里云·云计算·状态模式
翼龙云_cloud2 天前
国际云代理商:2026年国际云注册风控升级实战指南 8 大平台无卡解决方案对比
服务器·阿里云·云计算