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

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

相关推荐
吉普赛的歌8 小时前
【阿里云】记一次oss攻击
阿里云·云计算
九皇叔叔8 小时前
Linux 系统配置 NTP 服务:轻松同步阿里云时间服务器
linux·服务器·阿里云
wanhengidc8 小时前
移动端云手机的优势都有哪些?
运维·服务器·游戏·智能手机·云计算
siliconstorm.ai11 小时前
阿里下场造“机器人”:从通义千问到具身智能,中国AI正走向“实体化”阶段
人工智能·自然语言处理·chatgpt·机器人·云计算
沐欣工作室_lvyiyi14 小时前
基于腾讯云的物联网导盲助手设计与实现(论文+源码)
单片机·物联网·云计算·毕业设计·腾讯云·导盲杖
九河云15 小时前
在云计算环境中实施有效的数据安全策略
大数据·网络·数据库·云计算
openHiTLS密码开源社区15 小时前
ARMv9 CCA机密计算架构演进技术解析:重塑云原生时代的数据安全基石
云计算·arm·trustzone·realm·cca·机密计算·tee/ree
缘的猿1 天前
云计算划分标准与Kubernetes NetworkPolicy深度解析
容器·kubernetes·云计算
互联网志1 天前
云计算综合标准化体系建设提供系统性指引
云计算