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

news/2024/11/28 11:33:05/

前言:

最近在项目中用到了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过滤器,给大家科普下,万一不知道名词是啥呢。

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1324151.html

相关文章

Linux操作系统基础

目录 计算机存储结构 冯.诺依曼结构 操作系统 在前几期我们学写了linux中常见的一些指令,本期我们将正式进行linux操作系统的学习。 计算机存储结构 要学习linux操作系统,我们就得先进行计算机存储结构的学习,要进行计算机存储结构的学…

ARM 1.15

滤波器 滤波器是对波进行过滤的器件,是一种让某一频带内信号通过,同时又阻止这一频带外信号通过的电路。 滤波器主要有低通滤波器、高通滤波器和带通滤波器三种,按照电路工作原理又可分为无源和有源滤波器两大类。 低通滤波器 电感阻止高频…

云边协同的 RTC 如何助力即构全球实时互动业务实践

作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…

群晖NAS搭建WebDav结合内网穿透实现公网访问本地影视资源

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

RabbitMQ入门精讲

1. 什么是消息队列 消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。 “消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机(RD8G37)超声波一体测距传感器实现简单的测距测速仪。 测距仪演示效果 新定义RD8G37Q48RJ开发板 超声波测距模块: 8位并口屏 1、main.c unsigned short timeConsuming0; unsigned int oldDistance;void rectClearS…

UnityShader UsePass介绍

1.功能描述 UsePass命令可以调用在另外1个Shader中已经被命名的passes 。简单说就是在编写新的Shader时可以使用UsePass调用另外一个写好的Shader里的Pass。 2.使用方法 1.在我原来的一个Shader文件,文件名为Shader "MyShader/Model_Shadow",…