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);
}
相关推荐
AIAdvocate1 小时前
Pandas_数据结构详解
数据结构·python·pandas
(⊙o⊙)~哦1 小时前
JavaScript substring() 方法
前端
小言从不摸鱼1 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
无心使然云中漫步2 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者2 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_2 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
罗政3 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
麒麟而非淇淋3 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120533 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
FreakStudio3 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy