spring boot 实现file文件上传

一:依赖安装

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二:上传配置

在application.yaml配置上传属性,路径地址为:src/main/resources/application.yaml

复制代码
spring:
  servlet:
    multipart:
      enabled: true # 开启文件上传,默认true
      max-file-size: 10MB # 单个文件最大大小
      max-request-size: 50MB # 单次请求总文件大小
      file-size-threshold: 2KB # 超过阈值写入临时文件

三:文件上传示例

复制代码
package com.example.demo.controller;

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

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.UUID;

@RestController
@RequestMapping("/upload")
public class UploadController {

    private static final String UPLOAD_PATH = "upload/";

    //单文件上传
    @PostMapping
    public String upload(@RequestParam("file") MultipartFile file)
    {
        if (file.isEmpty()) {
            return "文件不能为空";
        }

        //获取原始文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || !originalFilename.contains(".")) {
            return "文件名不合法";
        }
        //获取文件后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //格式校验
        String[] allowSuffix = {".jpg", ".png", ".jpeg", ".gif"};
        if (!Arrays.asList(allowSuffix).contains(suffix.toLowerCase())){
            return "不支持该文件类型";
        }
        //定义保存文件名
        String fileName = UUID.randomUUID() + suffix;

        File dest = new File(UPLOAD_PATH, fileName).getAbsoluteFile();

        File dir = dest.getParentFile();
        if (!dir.exists() && !dir.mkdirs()) {
            return "上传失败:目录创建失败";
        }

        try {
            file.transferTo(dest);
            return "上传成功,文件名:" + fileName;
        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败:" + e.getMessage();
        }
    }

    //多文件上传
    @PostMapping("/batch")
    public String batch(@RequestParam("files") MultipartFile[] files)
    {
        if (files == null || files.length == 0) {
            return "请选择文件";
        }
        for (MultipartFile file : files) {
            if (!file.isEmpty()) {

                //获取原始文件名
                String originalFilename = file.getOriginalFilename();
                if (originalFilename == null || !originalFilename.contains(".")) {
                    return "文件名不合法";
                }
                //获取文件后缀
                String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

                //格式校验
                String[] allowSuffix = {".jpg", ".png", ".jpeg", ".gif"};
                if (!Arrays.asList(allowSuffix).contains(suffix.toLowerCase())){
                    return "不支持该文件类型";
                }

                //定义保存文件名
                String fileName = UUID.randomUUID() + suffix;

                File dest = new File(UPLOAD_PATH, fileName).getAbsoluteFile();

                File dir = dest.getParentFile();
                if (!dir.exists() && !dir.mkdirs()) {
                    return "上传失败:目录创建失败";
                }
                try {
                    file.transferTo(dest);
                } catch (IOException e) {
                    e.printStackTrace();
                    return "部分文件上传失败";
                }
            }
        }
        return "批量上传完成";
    }
}

四:html示例

复制代码
<!DOCTYPE html>
<html>
<body>
    <form action="http://xxx/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file"/>
        <button type="submit">上传</button>
    </form>

    <hr>
    <!-- 多文件 -->
    <form action="http://xxx/upload/batch" method="post" enctype="multipart/form-data">
        <input type="file" name="files" multiple/>
        <button type="submit">批量上传</button>
    </form>
</body>
</html>

五:配置远程访问资源

如果需要直接通过 url 访问上传图片,需要配置静态资源映射

复制代码
package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        // 访问路径 /upload/** 映射到本地 /upload/
        registry.addResourceHandler("upload/**")
                .addResourceLocations("file:upload/");
    }
}
相关推荐
VX_bysjlw9851 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码2 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh2 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
Zelman2 小时前
测试层级与测试类型
后端·面试·测试
韩振方2 小时前
容器已经能运行了,为什么 Kubernetes 还要用 Pod?
后端
会编程的吕洞宾2 小时前
AgentScope Java 实战:给 AI Agent 加上权限管控
后端
code_slave(码畜)2 小时前
微服务架构落地:消息队列架构设计(下篇)——消息堆积、死信治理与集群监控告警实战
spring boot·spring cloud·微服务·云原生·中间件·架构
野生技术架构师2 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
小师兄吃牛肉3 小时前
Java语法 | 多重循环
java·开发语言·python