springmvc 进行上传文件时 报错springmvc 进行上传文件时

axios上传文件错误:Current request is not a multipart request 其实整个过程我一共经历了三个报错信息,分别是 1.Current request is not a multipart request:当前请求不是multipart 请求 2.the request was rejected because no multipart boundary was found:请求被拒绝,因为未找到多部分边界 3.Required request part ‘files’ is not present我是想在vue中实现一个上传文件的功能,采用axios方式上传,数据模式采用. 阅读详情

最近在项目中,使用springmvc 进行上传文件时,出现了一个问题:

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

....

以上堆栈信息省略。

乍看一下,没啥值得讨论的地方,就是说当前这个请求不是一个multipart request,也就是说不是上传文件的请求。但是,这结果还是令我稍感意外,为什么呢?因为,我本意是将文件这个参数作为非必要参数,类似下面这样:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResultView upload(@RequestParam(value = "file", required = false) MultipartFile file)

spring抛出上面的异常,就违背了我的本意,我明明设置了 “required = false”, 为什么还是不行? 于是,带着疑问去看了一下spring的源码,下面就跟大家分享一下spring mvc对于文件上传的处理。

 

--------------------------------------------------我是华丽的分割线-------------------------------------------------------

 

在spring mvc通过DispatcherServlet处理请求时,会调用到 doDispatch这个方法,当然这也是spring mvc处理请求最核心的方法:

复制代码
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            ModelAndView mv = null;
            Exception dispatchException = null;

            try {
                processedRequest = checkMultipart(request);
                multipartRequestParsed = (processedRequest != request);
复制代码

上面就是给出的有关上传文件的代码片段,看以看到,当spring处理请求的时候,首先第一步就去检查当前请求是否为上传文件的请求,那么,它是怎么检查的呢,接着往下看:

复制代码
protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
        if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
            if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {
                logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " +
                        "this typically results from an additional MultipartFilter in web.xml");
            }
            else if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) instanceof MultipartException) {
                logger.debug("Multipart resolution failed for current request before - " +
                        "skipping re-resolution for undisturbed error rendering");
            }
            else {
                return this.multipartResolver.resolveMultipart(request);
            }
        }
        // If not returned before: return original request.
        return request;
    }
复制代码

通过以上方法,我们可以看到如下逻辑:

(1)当 MultipartResolver 不为null的时候, 就通过它去检查当前请求是否为文件上传请求(通过CommonsMultipartResolver的isMultipart方法)。

(2)如果当前请求不是MultipartHttpServletReques并且不包含MultipartException异常,那么,就通过CommonsMultipartResolver去处理当前请求(通过调用resolveMultipart方法将当前请求包装为MultipartHttpServletRequest),返回包装后的请求。

(3)返回当前请求(未经处理的请求)。

接下来我们重点看看,spring是如何判断是否为文件上传的请求的:

CommonsMultipartResolver:

@Override
    public boolean isMultipart(HttpServletRequest request) {
        return (request != null && ServletFileUpload.isMultipartContent(request));
    }

这儿直接使用了Apache 的commons-fileupload中的ServletFileUpload, 那我们就来看看它究竟何许人也:

ServletFileUpload:

复制代码
public static final boolean isMultipartContent(
            HttpServletRequest request) {
        if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
            return false;
        }
        return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
    }
复制代码

以上代码说明:

(1)当前请求必须是post方法。

(2)如果是post方法,就通过 FileUploadBase 去进一步检测。

FileUploadBase:

复制代码
public static final boolean isMultipartContent(RequestContext ctx) {
        String contentType = ctx.getContentType();
        if (contentType == null) {
            return false;
        }
        if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) {
            return true;
        }
        return false;
    }
复制代码

以上方法说明:

只有当当前请求的contentType是 "multipart/" 的时候,才会将此请求当做文件上传的请求。

 

总结:

综合来看,spring其实是通过Apache的 commons-fileupload来检测请求是否为文件上传的请求。而commons-fileupload又是通过如下两个条件来判断:

1. 请求方法必须是 post.

2. 请求的contentType 必须设置为以 "multipart/" 开头。

这下你该明白为什么我们在上传文件的时候必须要做的那些设置了吧。

 

好啦,回到文章开始的问题:

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

这个问题是怎么导致的呢?

其实springmvc 在处理方法入参的时候,发现了你的一个参数为 MultipartFile 类型或者是其数组或者包含他的容器类型,那么springmvc 就会通过上面类似的方法去检验(通过contentType)。代码如下:

private void assertIsMultipartRequest(HttpServletRequest request) {
        String contentType = request.getContentType();
        if (contentType == null || !contentType.toLowerCase().startsWith("multipart/")) {
            throw new MultipartException("The current request is not a multipart request");
        }
    }

那么这个问题该如何解决呢?

(1)ContentType 必须设置为 multipart/ 开头的(通常是multipart/form-data)。我之所以会遇到这个问题,其实是因为在APP请求的时候明明使用的multipart/form-data,但是却始终通不过,尝试用浏览器OK。

(2)在保证(1)的情况,如果还是这个错误,那么通过上面的分析,其实也很好解决,怎么解决?

  spring在处理入参的时候, 不是遇到MultipartFile相关就会先去校验么,OK,利用这个,那么咱们可以改写入参(直接接收原生的http request),然后自己手动去校验啊对吧,这不就绕过了。当绕过这一步之后,springmvc会通过之前分析的代码,对收到的请求进行校验转换,最终也会得到MultipartHttpServletRequest。修改如下:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResultView upload(HttpServletRequest request) {
    if (request instanceof MultipartHttpServletRequest) {
        // process
    }
}


本文转载自:http://www.cnblogs.com/dongying/p/4388464.html

dubbo项目中使用SpringMVC做文件上传,对于使用MultipartFile文件传输时,报错Fail to decode request due to: RpcInvocation。 错误消息: |严重: Servlet.service() for servlet [taotao-manager-web] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invo... 阅读详情

相关推荐

【异常】SpringMVC上传文件异常,提示MultipartException: Current request is not a multipart request

原来是file(类目Excel)在desktop桌面的,已经被删除或者已经移动了,文件找不到就报这个错误了。

奶爸的编程之路,也就一周冷个三天 1875

org.springframework.web.multipart.MultipartException: Current request is not a multipart request

在做项目时,后端采用上传文件组件MultipartFile时,使用swagger测试文件上传出现了以下问题: 2022-03-24 22:02:07 |ERROR |http-nio-9000-exec-9 |DirectJDKLog.java:175 |org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] |Servlet.service() for servlet [dispatcher.

qq_56769991的博客 1万+

SpringMVC文件上传问题

问题描述:Spring MVC 文件上传 发送请求失败 Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest] 解决方案: 在servlet-context.xml 中添加配置

1034

org.springframework.web.multipart.MultipartException: The current request is not a multi

关于“org.springframework.web.multipart.MultipartException: The current request is not a multipart request”问题解决办法。大招:1.查看springMVC配置文件添加上传文件配置<!-- 上传文件 --> <bean id="multipartResolver" class="o...

MonkeyBrothers的博客 8206

2024最新实战:用1Panel面板+Docker快速部署Frps服务端(含Nginx配置模板)

本文详细介绍了2024年企业级内网穿透方案,通过1Panel面板和Docker技术快速部署Frps服务端,包含Nginx反向代理配置模板。从服务器选型、系统准备到安全加固,提供全栈实战指南,帮助企业和开发者高效实现内网穿透需求。

weixin_27966471的博客 422

【OpenCV】手眼标定实战:从原理到calibrateHandEye的完整实现

本文详细解析了机器人视觉中的手眼标定原理与实战,重点介绍了如何使用OpenCV的calibrateHandEye函数实现从数据采集到结果验证的完整流程。文章深入剖析了AX=XB核心方程,区分了眼在手上与眼在手外两种配置,并提供了详细的代码示例与避坑指南,帮助开发者精准建立相机与机械臂末端的坐标转换关系,是机器人精准抓取的关键技术。

weixin_29046611的博客 512

SpringMVC上传文件时报错文件空指针

SpringMVC框架问题

laradants的博客 3396

Ubuntu20.04下运行LOAM系列:A-LOAM、LeGO-LOAM、SC-LeGO-LOAM、LIO-SAM 和 LVI-SAM

在我第一篇博文Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM2+Gazebo仿真运行ORB-SLAM2+各种相关库的安装的基础环境下跑通A-LOAM首先已经按照上一篇文章已经安装好了ROS noetic、Eigen3.4.0、OpenCV4.2.0和PCL1.10,A-LOAM在Github的开源地址:https://github.com/HKUST-Aerial-Robotics/A-LOAM。接下来根据代码要求,需要安装Ceres,另外环境的变

zardforever123的博客 3万+

springMVC上传文件时报错

错误描述 1:java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory 问题解决 1:去Apache官网下载 commons-fileupload-1.3.3.jar,放置到 D:\java\apache-tomcat-8.0.52\lib\ 下 错误描述 2:解决完错误 1 后报出另外一个错误,Handler dispatch failed; nested exception is java.la

weixin_53592551的博客 135

AutoSAR MemMap模块详解及使用注意事项

在本文中,我们将深入探讨MemMap模块的实例解析,并介绍在使用该模块时需要注意的一些事项。在上述代码中,我们使用了MEMMAP_START_SEC_VAR_32BIT和MEMMAP_START_SEC_CODE来定义MemMap区域的起始位置,使用MEMMAP_STOP_SEC_VAR_32BIT和MEMMAP_STOP_SEC_CODE来定义MemMap区域的结束位置。1.合理划分MemMap区域:根据实际需求,合理划分MemMap区域,将不同类型的变量放置在不同的区域中,以便于管理和访问。

weixin_50547796的博客 2534

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 647

使用SpringMVC+layui上传文件时报错:Completed 406 NOT_ACCEPTABLE

SpringMVC中使用fastjson代替jackjson返回json格式

qq_51330453的博客 685

VS2019项目使用CGAL6.1配置教程详细步骤

在VS2019项目中使用CGAL详细步骤

插件开发 333

springmvc的MultipartFile参数如果不上传文件报错的问题

1 @RequestMapping(value = "/updateInformation",method = RequestMethod.POST) 2 @ResponseBody 3 public Boolean updateInformation(Commodity commodity, HttpServletRequest request)throw...

weixin_30729609的博客 662

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 954

杰理SDK UART 使用教程

本文介绍了JL701n芯片的UART串口通信使用教程,重点讲解了UART2的初始化配置、数据收发和中断处理功能。教程详细说明了代码结构、核心功能函数、配置参数和使用步骤,包括UART初始化、数据发送和接收中断处理等关键操作。同时提供了完整的API接口说明和注意事项,强调了中断处理限制、缓冲区管理、引脚配置等重要细节。最后给出了基本使用流程和高级任务处理示例,并针对常见问题提供了故障排除建议。本教程适用于需要在JL701n芯片上实现可靠串口通信的开发者。

qq_42014563的博客 1819

SpringMVC中MultipartFile参数如果不上传文件报错的问题

针对springMVC上传文件是有时不需要传MultipartFile 参数,但是控制层用MultipartFile file 接收会报错,这时可以不用MultipartFile 接收,直接用HttpServletRequest request 接收,用方法 MultipartFile file= null; boolean isMultipart = ServletFileUp...

xfy18317776108的博客 1775

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

springmvc文件上传时遇到的问题

springmvc文件上传时遇到的问题 1.404。应该是自己的主页或者web路径配置的不对,主页放错文件夹,web.xml路径配置错误 2.500(IDEA项目没有报错,但是浏览器报错500没有类Client),检查环境配置 有可能是部署的war中没有响应的jar包,需要导入 3.403(禁止访问):。。。。。。未解决 ...

qq_41841880的博客 439

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringMVC 文件上传,Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]

本文介绍了,SpringMVC后台在接收浏览器的文件上传请求,报错 (org.springframework.web.multipart.MultipartFile]: Specified class is an interface) 的解决方法。

madifu的博客 578

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题

本文章是一个 SpringMVC拦 截器和文件上传下载的完整程序代码示例,使用的开发工具是 IntelliJ IDEA 2024.1.6 (Ultimate Edition), 开发环境是 OpenJDK-21 java version 21.0.2。Tomcatt版本为9.0.96,整体程序目录结构如下:本程序演示了 SpringMVC中的 interceptor 拦截器的使用,基于此拦截器实现对其它控制器如后台控制器中用户管理的操作程序示例。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 939

Spring Mvc上传文件报错MissingServletRequestPartException:Required request part ‘file‘ is not present两种解决方案

SpringMvc中上传文件 Required request part ‘file‘ is not present 两种解决方案

2301_77516476的博客 4593

文件及图片上传处理

前端post请求类型是file 所以只需要在controller层拦截post请求后, @RequestParam(“file”)MultipartFile file 用MultipartFile拦截请求参数即可取出 返回值通常是图片路径(String类型) service拿到后首先对文件类型进行安全校验,常见校验方法为,后缀名校验。 重命名,通常使用UUID加原后缀名。 UUID.rando...

vivibro的博客 296

SpringMVC跨服务器文件上传中的坑403 409.,特此记录!!Request processing failed;nested exception is com.sun.jersey.api

问题描述: springMVC跨服务器文件上传,一直报错定位到PUT。 错误类型:403 tomcat服务器默认readonly属性为true。这样服务器会拒绝写入文件,就是403错误了。 <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet

qq_40506747的博客 428

2021-02-02

SpringMVC 文件上传 multipartResolver 报错 最近复习SpringMvcmultipartResolver 报错 IDEA jdk 11 1.缺少jar 包 2. 避坑

qq_33473476的博客 180

nested exception is java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject

SpringMvc上传EXCEL文件的时候,启动报错 nested exception is java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject 记录一下。 原因: 缺少jar包 : poi-ooxml-schemas-3.11-20141221.jar 检查是否必要的jar包都存在。

莫道青天真无道,能逍遥时且逍遥! 5686

记录一下最近出现的小问题

一.使用Spring+SpringMVC+Mybatis开发的一个关于客户管理 项目启动报错500,找不到mapper文件两种解决办法: 1.使用Maven构建项目的时候,在pom.xml配置 &lt;build&gt; &lt;resources&gt; &lt;resource&gt; &lt;directory...

就你最近的表现 281
上一篇: angularjs做跨域遇到的一些问题
下一篇: 深入理解 Spring 事务原理
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值