前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决

2024-06-04 8223阅读

        本人新手一枚,因为该错误在网上找了许多解决方法都不能解决自己出现的问题,浪费了很多时间,因此记录自己解决该问题的过程,希望能够帮助出现该错误的朋友。

        先说明本人的框架使用,因为网上有许多解决办法,都有不同的框架,因此该方法可能只适用我使用的框架,当然你也可以用我的方法试试。前端使用的是原生javascript,没有使用任何框架,后端使用SpringMVC框架处理请求,但未使用SpringBoot整合,且使用的是全注解方式。

        关于我的错误提示,首先在网上搜寻了很多解决办法,最后都一一实践后发现没有作用,我大概列举一下:

        1、前端参数名与后端获取的参数名不一致(我的是一致的)

        2、前端在请求头"Content-Type"中设置为"multipart/form-data"(关于这点大多数都是使用的jQuery语法,我的是原生javacript,有所不同,但后面我也发现了关于这点的解释)

        接下来我阐述自己解决问题的过程:

        第一步:因为我发的是js的ajax请求模拟前端post请求,一直找不到原因,因此我先从form表单直接发送请求验证原因;

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第1张

        前端使用表单进行文件上传,关键点为需要将enctype设置为multipart/form-data

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第2张

        后端代码如图,在使用全注解时,依然会报Required part 'file' is not present错误,因此我先试用了xml配置的方法,使用xml则需要再web.xml配置文件中加入mutipart-config配置项即可,如下图

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第3张

        配置好以后前端发送请求,后端可以接收到文件信息

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第4张

若没有加上该配置项,则会报错,报错信息如图

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第5张

可以发现该错误不是Required part 'file' is not present,而出现该错误是因为我用了全注解的原因,因此在前端代码不变的情况下,我采用全注解的形式配置SpringMVC,因为网上有说加入一个mutiResolver类的解决方法,因此我也试了,最后发现加和不加都一样,因为我没有用到模板,因此该配置中略去前端模板的配置(已经证明与模板配置无关)

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第6张

然后再次发送请求,得到了Required part 'file' is not present错误,因此可以确定错误是在使用全注解情况下才会发生。

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第7张

第二步:在全注解上找问题

        通过上面分析可以知道,需要在web.xml文件中加入multipart-config才可以在后端接收到前端发送的文件,而如果没有加该配置项,则会报Failed to parse multipart servelet requeset错误,与我的Required part 'file' is not present不相同,而该错误是使用全注解才会发生该错误,因此猜测是某个注解初始化了multipart-config,而我们需要自己配置,因此在网上搜索了如何在SpringMVC中使用全注解方式配置wem.xml中的multipart-config,找了许多都没有完全的解答,我也是一个个对比时间得到了答案。

        首先,因为multipart-config是web.xml配置文件中的配置,因此我们也需要在该配置类中寻找答案,以下是我发生错误时的的web.xml的全注解配置

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第8张

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第9张

想要在该配置类中进行自定义的multipar-config配置,需要重写customizeRegistration方法,如下图所示

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第10张

在该方法中需要一个自定义配置类,因此需要自己去定义一个类实现MultipartConfig接口

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第11张

最后重新发送请求,请求成功

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第12张

第三步:从上面的讨论知道了是全注解的问题,需要自己配置,但是基于表单提交的,而我的前端请求方式是通过js的ajax异步请求,没有用到表单,而没有表单的情况下需要使用前端的Formdata来发送数据,与表单形式不同,接下来便讨论该种情况

        首先是我的前端代码,就是简单的js发送ajax的基本步骤

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第13张

注意这里我给请求头设置了和表单一样的格式(这里也是发生错误的地方)

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第14张这是网页呈现的前端效果,后端代码不变,先将自定义的multipa-config注释了看出现了什么问题

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第15张

出现了Required part 'file' is not present错误,接着我将自定义的multipa-config注释取消掉

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第16张

可以看见出现了Failed to parse multipart servelet requeset错误,因此从这里可以得出出现Required part 'file' is not present错误的原因是后端配置问题(当然也有其他原因,这里指出我的主要原因),前面我特意标注了前端ajax请求中将请求头类型改为与form表单一直的信息,而问题就出在这里,我将该信息设置注释掉后请求成功

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第17张

前端文件上传,后端SpringMVC出现Required part ‘file‘ is not present错误解决 第18张

总结:以上便是我花了一天多的时间才找到的错误根源,每个人情况都不一样,也希望我这篇踩坑文章能够帮到各位


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]