首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

springboot 3.x MultipartFile 参数总是为空 参数传递不进来

编程知识
2024年07月30日 09:45

场景:

在写一个统一文件上传的时候,MultipartFile参数一直传递不进来,一直为空。

排错方法:

我先是将业务简化,使用api文档进行测试,测试是前端问题还是后端问题。

简化后业务:

 用apifox文档测试之后,还是显示报错

{
    "code": 500,
    "message": "Required part 'file' is not present.",
    "result": null,
    "type": "error"
}

代表其实servlet请求体里根本没有这个文件流参数,跟文件名和参数名没有太大关系,而且文件上传springboot是默认打开的,也不需要显示的去打开

  # 数据源配置
  servlet:
    multipart:
      enabled: true
      max-file-size: 20MB
      max-request-size: 20MB

之后一直根据这个报错信息去查找相关文档,发现出现这个问题的有很多种原因,那就一个一个去排查

1.前后端参数名对应不一致
2.spring.servlet.multipart.enabled=false即关闭文件上传支持
3.配置文件中指定了文件上传时的大小值问题
4.切换内嵌容器tomcat到undertow的配置问题
5.spring.servlet.multipart.location=/tmp指定了临时文件站,但路径不存在
6.多次读取HttpServletRequest流
7.springboot已经有CommonsMultipartResolver,需要排除原有的Multipart配置@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})

一个个排查之后,发现自己在请求体到接口之前就被使用过多次,很符合多次读取HttpServletRequest流的问题

就是这里使用了:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * CachedBodyHttpServletRequest 扩展了 HttpServletRequestWrapper 类,
 * 用于缓存请求体,使其可以被多次读取。
 */
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {

    private final byte[] cachedBody;

    /**
     * 构造函数,读取请求体并进行缓存。
     *
     * @param request 原始的 HttpServletRequest
     * @throws IOException 如果发生 I/O 错误
     */
    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
        super(request);

        // 读取请求体并将其转换为字节数组
        InputStream requestInputStream = request.getInputStream();
        this.cachedBody = requestInputStream.readAllBytes();
    }
 
发现了问题,就好解决了,找到在哪里调用了这个请求体缓存,写这个缓存的目的也是为了解决请求体不能被多次使用的问题,因为我有一个自动检测验证码的拦截器需要去拦截登录接口的参数,
之前是方法没有注意,本来是不应该有这个错误的,第一个是没有正确在缓存里配置文件流的操作,第二个是验证码拦截器并没有针对登录接口专门做,而是都拦截了下来,导致都是用的这个缓存
 
之后就修改一下代码就好了,让这个拦截器只拦截登录接口的时候处理业务:
@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 检查请求 URL 和方法
        String url = request.getRequestURI();
        if ("/bt/login".equals(url) && request.getMethod().equals("POST")) {
            // 包装请求,缓存请求体
            CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request);
            try {
                // 解析请求体
                LoginUserDto loginUserDto = JSON.parseObject(cachedBodyHttpServletRequest.getReader(), LoginUserDto.class);

                // 验证码校验逻辑
                if (loginUserDto.getCode() == null || !loginUserDto.getCode().equals(redisUtil.get(RedisKeys.CAPTCHA + loginUserDto.getUuid()))) {
                    throw new CaptchaException("验证码错误");
                }

                // 验证码正确,删除验证码
                redisUtil.del(RedisKeys.CAPTCHA + loginUserDto.getUuid());
            } catch (CaptchaException e) {
                // 交给认证失败处理器
                loginFailureHandler.onAuthenticationFailure(cachedBodyHttpServletRequest, response, e);
                return;
            }
            // 继续处理请求
            filterChain.doFilter(cachedBodyHttpServletRequest, response);
        }
        filterChain.doFilter(request, response);
    }

 

到此,顺利解决问题。
{
    "code": 0,
    "message": "操作成功",
    "result": "url访问地址...",
    "type": "success"
}

 

 
From:https://www.cnblogs.com/del-x/p/18331828
本文地址: http://shuzixingkong.net/article/581
0评论
提交 加载更多评论
其他文章 优化 GitHub 体验的浏览器插件「GitHub 热点速览」
说回本周的开源热搜项目,第一个开源项目是推荐给 GitHub 产品经理的 refined-github,这是一个来自“民间”的优化 GitHub 使用体验的浏览器插件。一体化的令牌管理平台 Infisical,能够有效地防止令牌和密钥信息泄漏。友好的联邦学习框架 Flower,开箱即用对新手友好。
优化 GitHub 体验的浏览器插件「GitHub 热点速览」 优化 GitHub 体验的浏览器插件「GitHub 热点速览」 优化 GitHub 体验的浏览器插件「GitHub 热点速览」
文件系统(十一):Linux Squashfs只读文件系统介绍
liwen01 2024.07.21 前言 嵌入式Linux系统中,squashfs文件系统使用非常广泛。它主要的特性是只读,文件压缩比例高。对于flash空间紧张的系统,可以将一些不需要修改的资源打包成压缩的只读文件系统格式,从而达到节省空间的目的。 另外还有个特性就是它可以分块解压缩,使用数据会
文件系统(十一):Linux Squashfs只读文件系统介绍 文件系统(十一):Linux Squashfs只读文件系统介绍 文件系统(十一):Linux Squashfs只读文件系统介绍
云原生 .NET Aspire 8.1 新增对 构建容器、编排 Python的支持
.NET Aspire 用于云原生应用开发,提供用于构建、测试和部署分布式应用的框架,这些应用通常利用微服务、容器、无服务器体系结构等云构造。2024年7月23日宣布的新 8.1 版本是该平台自 5 月正式发布以来的第一次重大更新,Microsoft 对 .NET Aspire 的第一个重大更新As
云原生 .NET Aspire 8.1 新增对 构建容器、编排 Python的支持
SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴
开心一刻 一大早,她就发消息质问我 她:你给我老实交代,昨晚去哪鬼混了? 我:没有,就哥几个喝了点酒 她:那我给你打了那么多视频,为什么不接? 我:不太方便呀 她:我不信,和你哥们儿喝酒有啥不方便接视频的? 她:你肯定有别的女人了! 我:你老公就坐在我旁边,我敢接? 前情回顾 SpringBoot2
SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴 SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴 SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴
.NET 权限工作流框架 TOP 榜
前言 .NET权限管理及快速开发框架、最好用的权限工作流系统。 基于经典领域驱动设计的权限管理及快速开发框架,源于Martin Fowler企业级应用开发思想及最新技术组合(SqlSugar、EF、Quartz、AutoFac、WebAPI、Swagger、Mock、NUnit、Vue2/3、Ele
.NET 权限工作流框架 TOP 榜 .NET 权限工作流框架 TOP 榜 .NET 权限工作流框架 TOP 榜
[SDR] GNU Radio 系列教程 —— GNU Radio TX PDU (发送数据包操作)的基础知识(超全)
目录1 PDU 概述2 Demo 详解2.1 Random PDU Generator2.2 Async CRC322.3 Protocol Formatter (Async)2.4 将 header 和 payload 合并输出2.5 对 PDU 实施突发填充和渐变2.6 RRC 滤波与多相任意重
[SDR] GNU Radio 系列教程 —— GNU Radio TX PDU (发送数据包操作)的基础知识(超全) [SDR] GNU Radio 系列教程 —— GNU Radio TX PDU (发送数据包操作)的基础知识(超全) [SDR] GNU Radio 系列教程 —— GNU Radio TX PDU (发送数据包操作)的基础知识(超全)
LVM综合实验
实验目标 创建并管理一个 LVM 卷组 (VG)。 在卷组中创建、扩展和缩小逻辑卷 (LV)。 创建和使用快照。 实验环境 Linux 服务器 三个可用的磁盘分区: /dev/sdb1, /dev/sdb2, 和 /dev/sdb3 实验步骤 步骤 1: 安装 LVM 工具 确保 LVM 工具已安装
LVM综合实验 LVM综合实验 LVM综合实验
我用Awesome-Graphs看论文:解读PowerGraph
这次向大家分享发表在OSDI 2012上的一篇经典图计算框架论文PowerGraph,旨在通过点切分解决图数据幂律分布导致的计算倾斜问题,并提出了区别于Pregel's VC(以点为中心)的GAS(以边为中心)计算框架。
我用Awesome-Graphs看论文:解读PowerGraph 我用Awesome-Graphs看论文:解读PowerGraph 我用Awesome-Graphs看论文:解读PowerGraph