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

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

相关推荐
wanhengidc3 小时前
什么是裸金属服务器
运维·服务器·科技·智能手机·云计算
@HNUSTer4 小时前
基于 GEE 使用 Landsat-9 卫星的 Level-2 级数据实现水体表面温度反演
云计算·数据集·遥感大数据·gee·云平台·landsat·温度反演
TG:@yunlaoda360 云老大5 小时前
腾讯云国际站代理商TEFP有什么优势呢?
大数据·云计算·腾讯云
ZStack开发者社区5 小时前
ZStack HelixOS通过openEuler认证 打造国内生态虚拟化新底座
云计算
wanhengidc6 小时前
电脑端 云手机都有哪些注意事项
运维·服务器·安全·智能手机·云计算
TG:@yunlaoda360 云老大6 小时前
如何了解腾讯云国际站代理商的MRP有什么优势呢?
大数据·云计算·产品运营·腾讯云
有谁看见我的剑了?7 小时前
Vmware vSphereClient为虚机安装vmtools
运维·云计算
suki_lynn7 小时前
云手机全息备份,您的数据安全“时光保险箱”
智能手机·云计算·安卓
wanhengidc7 小时前
云端算力 云手机 巨 椰
运维·服务器·科技·智能手机·云计算