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/");
    }
}
相关推荐
2301_780789667 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设8 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒9 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn9 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川9 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵9 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David9 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10010 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin10 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质11 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring