Spring Boot 实现文件本地以及OSS上传

Spring Boot 实现文件上传

Maven依赖

xml 复制代码
<dependency>
   <groupId>com.aliyun.oss</groupId>
   <artifactId>aliyun-sdk-oss</artifactId>
   <version>3.15.1</version>
</dependency>

上传到本地

java 复制代码
package yang.controller;

import java.util.UUID;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/upload")
public class UploadController {
    @PostMapping
    public void upload(@RequestPart MultipartFile file) throws IOException {
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 获取文件扩展名
        String extName = fileName.substring(fileName.lastIndexOf("."));
        // 获取项目根目录
        String root = System.getProperty("user.dir");
        // 获取文件存放目录
        String fileDir = "/src/main/java/yang/upload/";

        // 如果目标目录不存在就创建
        File dir = new File(root + fileDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 生成不重复的文件名称
        String uuidName = UUID.randomUUID().toString() + extName;

        // 文件上传的位置
        String uploadDir = root + fileDir + uuidName;

        // 上传文件
        file.transferTo(new File(uploadDir));
    }
}

上传到OSS

java 复制代码
package yang.controller;

import java.util.UUID;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import yang.pojo.Result;

import java.io.InputStream;

@RestController
@RequestMapping("/upload")
public class UploadController {
    @PostMapping
    public Result upload(@RequestPart MultipartFile file) throws IOException {
        // Endpoint(地域节点)
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

        // 秘钥
        String accessKeyId = "LTAI5tNVbvdh8BGmnK3GNa4i";
        String accessKeySecret = "JXN5Mc3e40QlOxGBBUVJjAsw2TNCR2";

        // Bucket名称
        String bucketName = "qweqweqweqweqw12312cds";

        // 文件名称
        String fileName = file.getOriginalFilename();
        // 创建一个不重复的文件名称
        String uuidName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 文件输入流
            InputStream inputStream = file.getInputStream();

            // 将文件上传到OSS
            ossClient.putObject(bucketName, uuidName, inputStream);

            // 文件访问路径
            String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + uuidName;

            return Result.success(url);
        } catch (OSSException oe) {
            System.out.println("捕获了 OSSException, 这意味着您的请求已发送到 OSS, 但由于某种原因被拒绝并显示错误响应");
            return Result.error(oe.getMessage());
        } catch (ClientException ce) {
            System.out.println("捕获 ClientException, 表示客户端在尝试与 OSS 通信时遇到, 严重的内部问题, 例如无法访问网络。");
            return Result.error(ce.getMessage());
        } finally {
            if (ossClient != null) {
                // 最后记得关闭ossClient
                ossClient.shutdown();
            }
        }
    }
}

封装工具类

上面的代码我们可以定义一个工具类,这样在任何需要文件上传的地方只需要调用 upload 方法即可,大大减少了代码量

java 复制代码
package yang.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Component
public class AliOSSUtils {
    private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    private String accessKeyId = "LTAI5tNVbvdh8BGmnK3GNa4i";
    private String accessKeySecret = "JXN5Mc3e40QlOxGBBUVJjAsw2TNCR2";
    private String bucketName = "qweqweqweqweqw12312cds";

    public String upload(MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();

        String fileName = file.getOriginalFilename();
        String uuidName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));

        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, uuidName, inputStream);

        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + uuidName;

        ossClient.shutdown();

        return url;
    }
}

使用工具类

java 复制代码
@PostMapping
public Result upload(@RequestPart MultipartFile file) throws IOException {
    AliOSSUtils oss = new AliOSSUtils();
    String url = oss.upload(file);

    return Result.success(url);
}
相关推荐
加班是不可能的,除非双倍日工资4 小时前
css预编译器实现星空背景图
前端·css·vue3
IT毕设实战小研4 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
mit6.8245 小时前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员5 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
gnip5 小时前
vite和webpack打包结构控制
前端·javascript
一只爱撸猫的程序猿5 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
excel5 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
甄超锋5 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端