SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

前言:

最近在项目中用到了Excel模板导入功能,但是在测试阶段用Postman测试时,通过Post请求,传到后端的File一直为null。其中前端传参和请求都没问题,后端的接参也没问题,问题出在过滤器的复用上。

问题场景:

前端上传模板,导入excel做批量新增。入参为File。

问题原因:

是项目中加了过滤器导致的,过滤器是为了request重复使用,但是文件请求类型multipart/form-data和其他类型不一样,所以过滤器没法处理导致进不了Controller。

原过滤器配置

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {

ServletRequest requestWrapper = null;

if (requestinstanceof HttpServletRequest) {

requestWrapper = new RequestWrapper((HttpServletRequest) request);

}

复制代码
    if (null == requestWrapper) {
        filterChain.doFilter(servletRequest, response);
    } else {
        filterChain.doFilter(requestWrapper, response);
    }
}

修改过滤器将其改成兼容模式

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

复制代码
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String contentType = httpServletRequest.getContentType();
    //判断请求类型
    if (contentType == null) {
        //表单请求
        filterChain.doFilter(servletRequest, servletResponse);
        return;
    } else if (contentType.startsWith("multipart/")) {
        //文件上传类型
        filterChain.doFilter(servletRequest, servletResponse);
        return;
    } else if (contentType.startsWith("application/json")) {
         //json请求
        ServletRequest requestWrapper = null;
        if (servletRequest instanceof HttpServletRequest) {
            requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
        }


        if (null == requestWrapper) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(requestWrapper, servletResponse);
        }
    }

}

问题排查:

网上的解决方式众说纷云,都是再说后端入参的接参不对。要加@RequestParam("file")或者@RequestPart("file") 再或者 @RequestBody。其实这些都没有用,而且 加上@RequestParam("file")注解就报Requied request part 'file' is not present错误。如果在确定前端正确传参,后端正确接参的情况下。依然 为null。很容易就联想到是中间联络初出问题了,那就在过滤器和拦截器之前找问题。一看过滤器没有兼容multipart/form-data就定位了。这种问题不设置过滤器是复现不出来的,一旦加了没有做兼容就会有问题。

用两张图说明

Interceptor拦截器,Filter过滤器,给大家科普下,万一不知道名词是啥呢。


相关推荐
程序员爱钓鱼7 小时前
Rust 数据类型详解:整数、浮点数、布尔、字符、元组和数组
后端·rust
geovindu7 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
AC赳赳老秦7 小时前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
CoderYanger7 小时前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
从零开始的代码生活_8 小时前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
mCell16 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯17 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
IT_陈寒20 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
ZhengEnCi1 天前
S02-SpringBoot实体类新增字段对已有数据的影响及自动DDL同步机制详解
数据库·spring boot
程序员张31 天前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端