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);
}
相关推荐
呱牛do it3 分钟前
Python Matplotlib图形美化指南
开发语言·python·matplotlib
pianmian16 分钟前
python制图之小提琴图
开发语言·python·信息可视化
橙子小哥的代码世界9 分钟前
【机器学习】【KMeans聚类分析实战】用户分群聚类详解——SSE、CH 指数、SC全解析,实战电信客户分群案例
人工智能·python·机器学习·kmeans·数据科学·聚类算法·肘部法
计算机徐师兄9 分钟前
Python基于Flask的豆瓣Top250电影数据可视化分析与评分预测系统(附源码,技术说明)
python·flask·豆瓣top250电影数据可视化·豆瓣top250电影评分预测·豆瓣电影数据可视化分析系统·豆瓣电影评分预测系统·豆瓣电影数据
k layc13 分钟前
【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》
人工智能·python·机器学习·语言模型·自然语言处理·大模型推理
知识分享小能手20 分钟前
Html5学习教程,从入门到精通,HTML5 简介语法知识点及案例代码(1)
开发语言·前端·javascript·学习·前端框架·html·html5
IT、木易22 分钟前
大白话React第二章深入理解阶段
前端·javascript·react.js
阿正的梦工坊28 分钟前
Sliding Window Attention(滑动窗口注意力)解析: Pytorch实现并结合全局注意力(Global Attention )
人工智能·pytorch·python
晚安72028 分钟前
Ajax相关
前端·javascript·ajax
图书馆钉子户30 分钟前
怎么使用ajax实现局部刷新
前端·ajax·okhttp