-----------------------------------------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. 分布式网站架构后续:zookeeper技术浅析

    Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用 越来越多.今天我想谈谈zookeeper,本文不谈如何使用z ...

  2. vc判断文件是否存在

    #include <io.h> #include <stdio.h> #include <stdlib.h> void main( void ) { /* Chec ...

  3. 解决VS2013/VS2010简体中文版无法使用ReSharper快捷键的问题

    对于简体中文版VS2013,若应用ReSharper快捷键失效,按下面方法修复: 1) 首先在ReSharper设置里,应用你的快捷键设置 2) 关闭VS2013,然后用记事本打开“%LOCALAPP ...

  4. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  5. 构建高性能web站点--读书大纲

    用户输入你的站点网址,等了半天..还没打开,裤衩一下就给关了.好了,流失了一个用户.为什么会有这样的问题呢.怎么解决自己站点“慢”,体验差的问题呢. 在这段等待的时间里,到底发生了什么?事实上这并不简 ...

  6. android 拦截事件

    在做布局文件时,经常会有布局组件压在其它组件上面,这样点击上面布局没有控件的部分就会点中下面布局的控件. 如何拦截事件不让事件传递到下一层呢? 布局组件onTouchEvent() 用于处理事件,返回 ...

  7. 页面异步加载javascript文件

    昨天听一同事说的异步加载js文件,可以提高页面加载速度.具体方法如下:(function() {  var ga = document.createElement('script'); ga.type ...

  8. ubuntu eclipse 安装svn

    1.helper->install new software 在弹出的窗口中work with 输入http://subclipse.tigris.org/update_1.6.x 2.下面窗口 ...

  9. AFNetWorking 使用记录

    1.从一个URL  GET数据 方法1: NSURL * url = [NSURL URLWithString:@"http://www.weather.com.cn/data/sk/101 ...

  10. 白盒测试之初识gtest工具

    因为公司最近对软件产品质量提高了要求,之前项目组中黑盒测试方法就越来越无法满足公司的要求.虽然作为研发,但是也要求对白盒测试有一个系统的了解(毕竟之前没有系统的接触过白盒测试). 单元测试工具有很多种 ...