springboot2.6+上传文件失败?

项目中自定义了一个过滤器继承 OncePerRequestFilter

public class OnceFilter extends OncePerRequestFilter {

@Override

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

ServletRequest requestWrapper = null;

setRequestChainInfo(request);

if(request instanceof HttpServletRequest) {

requestWrapper = new RequestWrapper( request);

}

// 让下一个filter生效

if(requestWrapper == null) {

filterChain.doFilter(request, response);

} else {

filterChain.doFilter(requestWrapper, response);

}

// 清除MDC

MDC.clear();

}

/**

* 设置整个请求链路信息

* @param req HttpServletRequest

*/

private void setRequestChainInfo(HttpServletRequest req) {

String traceId = req.getHeader(CoreCommonConstant.TRACE_ID);

if (StringUtils.isBlank(traceId)) {

traceId = CsRandomUtil.randomUUID(true,true);

}

req.setAttribute(CoreCommonConstant.TRACE_ID,traceId);

MDC.put(CoreCommonConstant.TRACE_ID, traceId);

// 设置用户信息

MDC.put(CoreCommonConstant.USER_INFO,req.getHeader(CoreCommonConstant.USER_INFO));

}

}

但是上传文件的时候报错,

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed

然后我把这个过滤其注释后就可以上传了,
我想保留这个过滤器,还有其它办法可以解决上传的问题吗??

yml配置项:

spring:

mvc:

hiddenmethod:

filter:

enabled: true

servlet:

multipart:

enabled: true

location: /upload_tmp

max-file-size: 10MB #设置单个上传的文件大小

max-request-size: 20MB #设置单次请求的文件的总大小


回答:

过滤器你不会是读一次文件,然后接口你又读一次文件吧?


回答:

Multipart流只能读一次吧. 要么包装请求, 把这个流缓存一下, 要么把流用完reset一下.


回答:

你这个拦截器的目的是对HttpServletRequest请求进行相关自定义操作,具体的需要看RequestWrapper这个类的内容
这里前端上传会发送一个MultipartServletRequest,他是HttpServletRequest的一个特殊的实现,所以会走

if(request instanceof HttpServletRequest) {

requestWrapper = new RequestWrapper( request);

}

在这里发生了类型转换,返回的requestWrapper是一个ServletRequest,这是一个擦除,对正常的parameter,body这种请求影响不大,但是对multipart后续处理会有影响。

这里一般需要再次判断request instanceof MultipartServletRequest,可以直接下传,或者根据需要单独实现一个针对multipart的request servlet wrapper,保证返回类型后继续下传

以上是 springboot2.6+上传文件失败? 的全部内容, 来源链接: utcz.com/p/944810.html

回到顶部