FileUpload--ServletFileUpload.parseRequest()在springboot中使用出现的问题

在SpringBoot项目中使用ServletFileUpload进行文件上传时遇到问题,包括`getServletContext().getRealPath()`报错、`upload.parseRequest(req)`报错以及获取空list。问题源于Spring Boot的MultipartResolver与ServletFileUpload冲突。解决方案是关闭Spring Boot的默认Multipart配置,可在配置文件中进行设置。同时,文章提供了js代码及相关方法的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码,代码中注释(代码出处https://www.cnblogs.com/liuyangv/p/8298997.html)
java 中的注释写的非常详细



先说下这段代码中出现的错误,js代码 后附上
1.
String realPath = this.getServletContext().getRealPath("/upload");报错this.getServletContext()
更改为:
request.getSession().getServletContext().getRealPath("/upload");

2.
List items =upload.parseRequest(req); 报错upload.parseRequest
更改为:
List items = upload.parseRequest(new ServletRequestContext(request));
3.
List items获取到空list
其中FileItemIterator iter = upload.getItemIterator(request);这段获取的是空值。
(引自:https://blog.csdn.net/zhou_pp/article/details/85060076)
问题的原因是:

spring-boot自带的org.springframework.web.multipart.MultipartFile
和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将multipartResolve配置去除,问题就解决了。

在使用ServletFileUpload时需要关闭Spring Boot的默认配置 ,所以在配置文件中添加

spring.http.multipart.enabled=false 

获取的是空值是最大的问题, 总结问题有
网上搜索该问题的解决方法,大致有以下两种:
(1)原因在于Spring的配置文件中已经配置了MultipartResolver,导致文件上传请求已经被预处理过了,所以此处解析文件列表为空,对应的做法是删除该段配置。
(2)认为是structs的过滤器导致请求已被预处理,所以也要修改对应过滤器的配置。
然而,在SpringBoot下,上述两种解决方法不可能做到,因为SpringBoot的相关配置都是自己完成的,根本没有显示的配置文件。况且以上两种解决方法,修改配置文件可能影响整个工程的其他部分,所以得另寻方案.

package cn.gs.ly;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
impor
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值