• 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

  • 相关阅读:
    Fliptile
    Face The Right Way
    Jessica's Reading Problem
    Subsequence
    Xcode下载途径
    target信息异常
    清除编译缓存DerivedDate
    Xcode快捷键
    Xcode忽略编译警告
    iOS项目Info.plist中关键字汇总
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/5515030.html
Copyright © 2020-2023  润新知