-----------------------------------------struts2 下载时报java.lang.IllegalStateException------------------------------------------------------------- 抛出java.lang.IllegalStateException异常,终于发现原因之所在:

我们在做文件上传或者下载,用到页面的输出流. 在action中使用下载的方法:

//文件下载

public String downFile() throws IOException{

String msg=null;

response.setCharacterEncoding("gb2312");

response.setContentType("text/html");

javax.servlet.ServletOutputStream ou = response.getOutputStream();   //文件名

String filename=new String(request.getParameter("filename").getBytes("ISO8859_1"),"utf-8").toString();   //路径

String filepath=ServletActionContext.getServletContext().getRealPath("/upload/"+filename);

java.io.File file = new java.io.File(filepath);

if (!file.exists()) {

System.out.println(file.getAbsolutePath() + " 文件不能存在!");

msg="抱歉,文件可能过期了!";

super.addActionError(msg);

return null;

}

// 读取文件流

java.io.FileInputStream fileInputStream = new java.io.FileInputStream(file);   // 下载文件

// 设置响应头和下载保存的文件名

if (filename != null && filename.length() > 0) {

response.setContentType("application/x-msdownload");//弹出下载的框

response.setContentLength((int) file.length());//下载统计文件大小的进度

response.setHeader("Content-Disposition", "attachment; filename=" + new String(filename.getBytes("gb2312"),"iso8859-1") + "");

//response.setHeader("Content-Length", file.length());   //下载框的信息

if (fileInputStream != null) {

int filelen = fileInputStream.available();   //文件太大时内存不能一次读出,要循环

byte a[] = new byte[filelen];

fileInputStream.read(a);

ou.write(a);

}

fileInputStream.close();

ou.close();

}

return SUCCESS;

}

抛出异常:java.lang.IllegalStateException

原因分析:

这是web容器天生的servlet代码中有out.write(””),

这个和JSP中调用的response.getOutputStream()产生冲突.

即Servlet规范说明,

不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,

在调用第二个时候应会抛出 IllegalStateException,

解决:  action方法:

public String downTest(){

try {

name =new String(getFilename().getBytes("iso-8859-1"),"utf-8");

tname=java.net.URLEncoder.encode(name,"utf-8");

String path=ServletActionContext.getServletContext().getRealPath("/upload/"+name);

File file=new File(path);

inputStream=new FileInputStream(file);

response.setContentLength((int) file.length());//下载统计文件大小的进度

} catch (Exception e) {

e.printStackTrace();

}   return SUCCESS;

}

struts2.xml:

<!-- 下载中心控制器 -->

<action name="download" class="downloadAction">

<result name="success" type="stream">    <!-- 设置输入流 -->

<param name="inputstream">inputStream</param>

<!-- 设置下载的方式及文件名 -->

<param name="contentDisposition">attachment;filename=${tname}</param>

</result>

<interceptor-ref name="defaultStack"></interceptor-ref>

</action>

struts2 下载时报java.lang.IllegalStateException的更多相关文章

  1. struts2异常记录--java.lang.IllegalStateException

    java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFa ...

  2. 处理eclipse启动时报java.lang.IllegalStateException

    这是我写的第一篇博客,博客我来了: 我是好学的人,希望在这上面遇到志同道合的人,对技术有更高追求的人: 重启eclipse的时候报出来 An error has occurred, See the l ...

  3. Jetty提交数据时报java.lang.IllegalStateException: Form too large270468>200000问题解决

    今天在使用Eclipse的Jetty插件做为服务器提交富文本编辑中的数据时,报如下异常: 在\eclipse\plugins目录下,找到org.mortbay.jetty.server_6.1.23. ...

  4. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState问题解决

    (1)我用的是fragment,在onStop但是没有onDestroy的情况下切换(replace)fragment时报 java.lang.IllegalStateException: Can n ...

  5. Eclipse------使用Debug As时报错java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX

    报错信息: java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file ...

  6. 使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1

    我在RestTemplate的配置类里使用了 @LoadBalanced@Componentpublic class RestTemplateConfig { @Bean @LoadBalanced ...

  7. Spring3.x 版本和 JDK1.8 不兼容导致 java.lang.IllegalStateException: Failed to load ApplicationContext

    由于安装了 JDK1.8 的版本,最近在进行整合 Struts2+Spring+Hibernate 框架的时候,不小心导入了之前下载的 Spring 3.2.0 版本的 jar 包. 结果在运行测试用 ...

  8. 用java实现文件下载,提示java.lang.IllegalStateException: getOutputStream() has already been called for this response

    1. 用java实现文件下载,提示java.lang.IllegalStateException: getOutputStream() has already been called for this ...

  9. java.lang.IllegalStateException: getWriter() has already been called for this response问题解决

    java.lang.IllegalStateException: getWriter() has already been called for this response问题解决 java.lang ...

随机推荐

  1. ecshop 优化_将商品详情页goods.php重命名为shangpin.php

    有人说,将商品详情页的文件名 goods.php 改一个名字,对百度收录会有帮助,也许吧,这里不讨论是否有帮助,这里只讲解如何重命名. 例如:我们将 goods.php 改为 shangpin.php ...

  2. final修饰符,finally,finalize区别

    1.final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此,一个类不能即被声明为abstract,又被声明为final.将变量或方法声明为final,可以保证 ...

  3. IE6对CSS支持Bug收集

    1.IE6双外边距 在IE6下,如果对元素设置了浮动,同时又设置了margin-left或者margin-right,margin值会加倍. 例如,设置margin-left:10px在IE6下会显示 ...

  4. informatica9.5.1资源库为machine in exclusive mode(REP_51821)

    错误信息: [PCSF_10007]Cannot connect to repository [Rs_RotKang] because [REP_51821]Repository Service is ...

  5. python中隐式的内存共享

    在python中,基本上使用的是引用,那么就会造成一个隐式的内存共享,特别是在容器对象中,例如list,dictionary 对于不可变对象,是不会造成隐式的内存共享情况,如下所示: >> ...

  6. win7 提示"Windows 无法连接到System Event Notification Service服务......"的解决办法

    登录win7系统,突然出现如图1的提示,无线网络中断,不能上网,多次插拔无线网卡问题依然. 图1 解决过程如下: 1.检查网卡硬件状况,在设备管理器中查看网卡现象正常,排除网卡硬件故障. 2.查看服务 ...

  7. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  8. delphi 中怎么知道某一个月有多少天

    if (month in (1,3,5,7,8,10,12)) return 31; else if (month in(4,6,9,11)) return 30; else if (year 是闰年 ...

  9. 快速入门linux系统的iptables防火墙 1 本机与外界的基本通信管理

    概述 iptables是一种运行在linux下的防火墙组件,下面的介绍可以快速的学习iptables的入门使用. 特点(重要) 它的工作逻辑分为 链.表.规则三层结构. 数据包通过的时候,在对应表中, ...

  10. mysql 语句碎片

    1. find_in_set('''$ip''',CONCAT('''', REPLACE( REPLACE(w_ip,',',''',''') ,'-',''',''') 2. grant all ...