记录关于Cause为Stream Closed的FileUploadException

本文记录了一个关于上传头像和图片模块开发过程中遇到的问题。在使用Spring框架进行权限拦截时,出现了一个Stream Closed的异常,原因是权限拦截器关闭了输入流,导致CommonsMultipartResolver无法完成清理工作。通过调整权限拦截器逻辑,对于multipart请求不关闭流,最终解决了异常。

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

今天在写上传头像和图片模块时,再加上自己的权限拦截器时,在无权限时会抛出异常:

WARN 2018-05-08 20:27:14,198 [http-apr-8080-exec-7] org.springframework.web.multipart.commons.CommonsMultipartResolver: - Failed to perform multipart cleanup for servlet request
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream closed

看了看异常描述,大致是CommonsMultipartResolver无法完成清理(cleanup)工作,于是寻找CommonsMultipartResolver中的方法,发现有一个cleanupMultipart()方法,该方法描述如下:

public void cleanupMultipart(MultipartHttpServletRequest request) {
    if (request != null) {
        try {
            cleanupFileItems(request.getMultiFileMap());
        }
        catch (Throwable ex) {
            logger.warn("Failed to perform multipart cleanup for servlet request", ex);
        }
    }
}        

继续追查异常原因,发现是在调用getMultiFileMap()抛出的,其中,当multipartfile变量为null时,会开始一个初始化的动作,这里会调用parseRequest()这个方法,在debug模式下发现request的inputstream是closed的,于是返回我的权限拦截器,在反复发送请求,发现我的工具类WebDataUtils里的writeJson里有这么一段代码:

try {
writer
= response.getWriter(); writer.write(JSON.toJSONString(resultMap)); } finally { if(writer != null) { writer.close(); } }

这是在发生IOException时,关闭流的正常操作,但没想到调用了writer的close时,因为response里有一个request的引用,requset的inputstream也一同关闭了,所以导致后面CommonsMultipartResolver清理时发生了Stream closed的异常。于是在权限拦截器中加入了判断请求是否是multipart请求,如果是,则不关闭流,最后交给CommonsMultipartResolver清理,最终解决了该异常。

转载于:https://www.cnblogs.com/cedriccheng/p/9010839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值