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);
}
相关推荐
MarkHD1 分钟前
智能体在车联网中的应用:第12天 CARLA实战:编写Python客户端生成与控制车辆,迈向联合仿真
开发语言·python
Generalzy1 分钟前
应该是跨时代的更新——langgraph v1.0
python
xqqxqxxq3 分钟前
Java 集合框架核心用法与实战技术笔记
java·笔记·python
有味道的男人5 分钟前
Python 爬虫框架设计:类封装与工程化实践
开发语言·爬虫·python
Daily Mirror6 分钟前
Day40 简单 CNN
python
程序猿追8 分钟前
在昇腾NPU上实战部署LongCat-Video:从环境配置到长视频生成的完整指南
python·大模型·华为云·音视频
成都证图科技有限公司8 分钟前
Bus Hound概述
前端
l1t10 分钟前
豆包解读论文:将具有分支和循环控制流的命令式程序转换为标准SQL1999的公共表表达式
开发语言·数据库·人工智能·python·sql·postgresql·duckdb
————A12 分钟前
强化学习基础概念----状态、动作、策略、奖励
人工智能·python
BoBoZz1921 分钟前
PolyDataToImageDataStencil如何用多边形数据作为“模板”来裁剪或屏蔽图像数据
python·vtk·图形渲染·图形处理