zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)
    GRASP软件设计的模式和原则
    UniDAC 安装教程
    Delphi 实现检测线程类TThread是否结束
    DELPHI线程例子-FC
    Delphi Stringlist Delimiter如何区分TAB和空格
    DBGrid1
    UTF-8 delphi 函数
    未测试 Delphi读写UTF-8、Unicode格式文本文件
    mysql + unidac 使用事务例子
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/5515030.html
Copyright © 2011-2022 走看看