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

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

相关推荐
翼龙云_cloud5 小时前
阿里云渠道商:如何使用弹性伸缩来实现计算资源的弹性配置?
服务器·阿里云·云计算
落笔画忧愁e9 小时前
实测:利用腾讯云锐驰型 200M 带宽,搭建无门槛高清视频分发系统
云计算·腾讯云
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十五)GPU 信息采集与上报机制
云计算
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十三)GPU 资源管理总览
云计算
冬天的风滚草11 小时前
揭秘云原生混布资源调度器Koordinator (十四)DeviceShare 调度插件详解
云计算
CodeCaptain13 小时前
配置Nginx反向代理来实现负载均衡,续阿里云ECS配置Nginx反向代理
nginx·阿里云·负载均衡
Bin Watson13 小时前
Ubuntu安装Docker记录(基于阿里云)
ubuntu·阿里云·docker
CodeCaptain14 小时前
阿里云ECS上配置Nginx的反向代理
nginx·阿里云·云计算
有谁看见我的剑了?1 天前
VMware OVF Tool 工具安装学习
云计算
无我19871 天前
专业的厌氧池清淤哪家酷
阿里云