SpringBoot上传文件时抛出RequestFacade cannot be cast to MultipartHttpServletRequest异常

问题描述
  • 上传文件时抛出异常:
    org.apache.catalina.connector.RequestFacade cannot be cast to org.springframeworkweb.multipart.MultipartHttpServletRequest
  • 原本以为前端使用FormData上传文件就会出现这个问题,后来自己验证时发现,正确使用FormData,后台进行强转也是没有问题,因为目前只会Ajax,所以用Ajax进行验证。
  • 具体使用场景如下:
var formdata = new FormData($("#fileForm")[0]);
$.ajax({
       url: "http://127.0.0.1:8081/demo/fileupload",
       type: "post",
       data: formdata,
       cache: false,  // 有说是为了应对IE8及之前版本的缓存情况 
       processData: false, // 不处理数据, 没有该项前端会报错, Uncaught TypeError: Illegal invocation
       contentType: false, // 不设置内容类型, 没有该项后台会抛出异常RequestFacade cannot be cast to MultipartHttpServletRequest,该项表明ContentType:multipart/form-data
       success: function (result) {
            // ...
       },
       error: function () {
       }
});
@PostMapping("/fileupload")
public void demo(HttpServletRequest request) {
	MultipartHttpServletRequest params = (MultipartHttpServletRequest) request;
	// ...
}
解决方法一
  • 需要引入相应的jar包,包括commons-io和commons-fileuploade,否则抛ClassNotFoundException异常。
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest mhsr = resolver.resolveMultipart(request);
MultipartFile file = mhsr.getMultiFileMap.get("file").get(0); 
解决方法二
  • 不需要引入引入其它jar包,必须使用支持Servlet3.0的容器。
MultipartResolver resovler = new StandardServletMultipartResolver();
MultipartHttpServletRequest mhsr = resovler.resolveMultipart(request);
MultipartFile file = mhsr.getMultiFileMap().get("file").get(0);
解决方法三
  • 其实是方案二的配置方法,将StandardServlerMultipartResovler注册到容器中。
  • SpringBoot使用CommonsMultipartResolver时有默认配置,不用再注册CommonsMultipartResolve,否则MultipartFile会接收不到文件。
@Configuration
public class MultipartFileUploadConfiguration {
 	@Bean
	public MultipartResolver multipartResolver() {
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		return multipartResolver;
	}
}
扩展
  • SpringMVC提供CommonsMultipartResolver和StandardServletMultipartResolver两个MultipartResolver的实现用于处理multipart请求。
  • 文件上传的大小默认配置是:每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。所以会出现超出最大上传文件限制的情况。
  • 通过配置文件修改上传文件限制,这里需要注意不同SpringBoot版本的配置略有区别。详情可见感谢Chopper_Tony的分享
#上传文件总的最大值
spring.servlet.multipart.max-request-size=10MB
#单个文件的最大值
spring.servlet.multipart.max-file-size=10MB
  • 通过@Bean配置修改
@Configuration
public class MultipartFileUploadConfiguration {
 	@Bean
	public MultipartResolver multipartResolver() {
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		return multipartResolver;
	}
	
	@Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大
        factory.setMaxFileSize("102400KB"); //KB,MB
        // 设置总上传数据总大小
        factory.setMaxRequestSize("204800KB");
        return factory.createMultipartConfig();
    }
}
  • 如果是非SpringBoot项目,使用XML文件配置的话,要注意CommonsMultipartResolver和StandardServletMultipartResolver的不同。
<!-- CommonsMultipartResolver采用的方式 -->
<bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 限制所有上传文件的总共大小 -->
        <property name="maxUploadSize" value="204800000" />  
</bean> 

<!-- StandardServletMultipartResolver采用的方式 -->
<servlet>
        <servlet-name>fileUpload</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:[定义MultipartResovler的xml文件的相对路径]</param-value>  
        </init-param>  
        <load-on-startup>0</load-on-startup>
        <multipart-config>
            <location>D:/temp/</location>
            <max-file-size>102400000</max-file-size>
            <max-request-size>204800000</max-request-size>
        </multipart-config>
    </servlet>

如果本文所述内容有误,欢迎并感谢指正。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是因为在使用Spring框架,将一个org.apache.catalina.connector.requestfacade对象强制转换为org.springframework.web.multipart.MultipartHttpServletRequest对象出错。可能是因为你的代码中使用了错误的类型或者没有正确地配置Spring框架。建议检查代码和配置文件,确保正确使用了Spring框架。 ### 回答2: 这个错误是因为在应用程序中使用了两个不同的servlet API,一个是Tomcat中的org.apache.catalina.connector.requestfacade,另一个是Spring框架中的org.springframework.web.multipart.MultipartHttpServletRequest。这两个API使用的是不同的类和方法来处理HTTP请求。 在代码中,当尝试将org.apache.catalina.connector.requestfacade强制转换为org.springframework.web.multipart.MultipartHttpServletRequest,会出现这个错误。这可能是因为应用程序中同引用了Tomcat和Spring框架,但是在代码中将它们混淆了。 要解决这个问题,首先要去除其中一个API的依赖,并且在代码中只使用一个API。如果应用程序需要使用Tomcat和Spring框架,则需要确保在代码中正确使用它们。例如,对于文件上传,需要使用Spring框架的MultipartResolver解析器。 另外,还可以尝试在代码中使用Java Servlet API提供的Part接口来处理文件上传。 Part接口可以处理文本和二进制数据,而且它适用于所有的servlet容器,包括Tomcat和其他Java EE应用程序服务器。 总之,要避免org.apache.catalina.connector.requestfacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest错误,需要仔细检查应用程序的代码,确保只使用一个servlet API,并且在处理文件上传,正确使用相应的解析器或接口。 ### 回答3: 这个错误通常会在Spring应用程序中遇到,其中一个类被错误地强制转换为另一个类的实例。在这种情况下,org.apache.catalina.connector.requestfacade被错误地强制转换为org.springframework.web.multipart.multiparthttpservletrequest。 这个问题的解决方法是确保在使用Spring的候,你的项目使用正确的依赖包。在这种情况下,你需要确保你在你的项目中添加了正确的Spring依赖项,以便支持文件上传。你需要添加的依赖项是spring-web和spring-webmvc。你可以通过Maven或Gradle等构建工具来将它们添加到你的项目中。 另外,你需要确保你的servlet版本与你的Spring版本兼容。如果你使用的是Tomcat服务器,则需要确保你使用的是Tomcat 7.0.33或更高版本。 最后,如果你已经添加了正确的依赖项和版本,并且仍然遇到这个问题,那么你需要检查你的代码以查看是否有其他地方不正确的强制类型转换。你可以使用调试程序来进一步排查问题。 总之,当你在使用Spring进行文件上传,这个错误可能会出现,但你可以通过检查你的依赖项和版本、排查代码中的强制类型转换等方式来解决它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值