Struts2下载文件点取消出现的异常解决

Posted 张亮java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2下载文件点取消出现的异常解决相关的知识,希望对你有一定的参考价值。

struts2点击下载,如果正常下载不会报错,可是如果点击取消就会报如下的错误:

Java.lang.IllegalStateException: Cannot call sendError() after the response has been committed......

    1. 原因:

    2.     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文件下载中文名乱码

struts2文件下载出现Can not find a java.io.InputStream with the name的错误

网络异常下载失败是啥原因

Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)

如何修复java文件下载异常?

[原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题