Struts2下载文件点取消出现的异常解决
Posted 张亮java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2下载文件点取消出现的异常解决相关的知识,希望对你有一定的参考价值。
struts2点击下载,如果正常下载不会报错,可是如果点击取消就会报如下的错误:
Java.lang.IllegalStateException: Cannot call sendError() after the response has been committed......
-
原因:
-
stream对应的类是org.apache.struts2.dispatcher.StreamResult,该类的处理过程如下:
1、配置其中result标签下的各个参数
2、从服务器中获取输入流,并同时与客户端建立输出流(服务器与客户端链接通过Socket进行连接)
3、当点击“保存”或“打开”时,开始传输数据。如果点击“取消”,关闭所有的流
但是实际发现Socket并没有断开,并且流也没有关闭,所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出
解决方法:
1、下载struts2-sunspoter-stream-1.0.jar,复制到WEB-INF/lib下
2、在原有的struts.xml的基础上进行相应的配置,如下:
<package name="main" extends="struts-default" namespace="/">
<result-types>
<result-type name="streamx" class="com.sunspoter.lib.web.struts2.dispatcher.StreamResultX"></result-type>
</result-types>
<action name="down" class="com.ruida.web.action.PatentsAction" method="down">
<!-- 指定当前action 返回的类型为 (流) -->
<result name="success" type="streamx">
<!-- 指定当前文件的打开方式 attachment(以附件的形式打开文件) ,filename 指定文件的名字 ,${fileName}
对应 action中文件名的属性(用于在下载框中) -->
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
</result>
<result name="fail" type="redirect">/index.jsp</result>
</action>
</package>
红色部分为添加的部分,并在原有的result中type改为“streamx”
如果是使用注解方式同样如下:
@Result(type="streamx", params={"inputName","inputStream","bufferSize","4096", "contentDisposition", "attachment;filename=\"${downloadFileName}\""})
修改之后执行取消,效果如下:
[WARN] StreamResultX Warn : socket write error
以上是关于Struts2下载文件点取消出现的异常解决的主要内容,如果未能解决你的问题,请参考以下文章
struts2文件下载出现Can not find a java.io.InputStream with the name的错误