可实现文件下载功能,但会抛出异常,请哪位大侠分析一下帮我解决这个问题

hucz08 2012-08-15 09:00:59
jsp页面:
<a class="buttonnormal" href="javascript:void(0);" onclick="window.location='${pageContext.request.contextPath }/software/download.do?software.softwareid=${softwareid}'">下载</a></td>
action层:
public String softwareDownload() {
this.service.softwareDownload(software);
return ActionRSEnum.SUCCESS.getRS();
}
service层:
@Override
public void softwareDownload(Software software) {
HttpServletResponse response = ServletActionContext.getResponse();
try {
SoftwareBean softwareBean = new SoftwareBean();
SoftwareBaseBean softwareBaseBean = new SoftwareBaseBean();
softwareBean.setSoftwareid(software.getSoftwareid().toString());
softwareBaseBean = softwareInfo(softwareBean);
String downloadPath = softwareBaseBean.getDownloadPath();
String fileName = softwareBaseBean.getFileName();
File file = new File(downloadPath);
FileInputStream in = new FileInputStream(file);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
OutputStream out = response.getOutputStream();
int len = 0;
byte buffer[] = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
action.xml配置:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="software" extends="struts-default" namespace="/software">
<action name="download" class="webui.action.SoftwareAction" method="softwareDownload">
<result name="success">
/Jsp/software/software_list.jsp
</result>
<result name="error">/Jsp/error/error.jsp</result>
</action>
</package>
</struts>
这里不需要用DAO层
我是通过前台传进去id,根据ID获得绝对路径进行下载功能的,能够实现下载功能,可就是抛出异常:

2012-08-14 16:25:33.246:WARN::Committed before 500 STREAM
2012-08-14 16:25:33.246:WARN::/software/download.do
java.lang.IllegalStateException: Committed
at org.mortbay.jetty.Response.resetBuffer(Response.java:1024)
at org.mortbay.jetty.Response.sendError(Response.java:240)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:852)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:534)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:432)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at webui.filter.FilterIsLogin.doFilter(FilterIsLogin.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)


out.close之后我也没做什么啊

我不用加
response.setContentType("application/octet-stream");//设置文件类型
也可以下载jar,png等格式的文件类型啊

还有,我也并没有用到submit提交表单的,是通过访问连接实现的
我没找到flb7751415451所说的out.clear()方法啊,这个怎么用的?
...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxixrh 2013-08-09
  • 打赏
  • 举报
回复
我也有一种解决方法,加上response.setHeader("Content_Length", length); 其中length为要传输内容的长度,具体原因也不知道
Sammie 2012-08-15
  • 打赏
  • 举报
回复

// 下载本地文件
public void downloadLocal(HttpServletResponse response)throws FileNotFoundException {
String fileName = "1.xlsx".toString(); // 文件的默认保存名
// 读到流中
InputStream inStream = new FileInputStream("D:/1.xlsx");// 文件的存放路径
// 设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");
// 循环取出流中的数据
byte[] b = new byte[100];
int len;
try {
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
scbb 2012-08-15
  • 打赏
  • 举报
回复
我猜你的Action最后还是return mapping.findForward(ActionRSEnum.SUCCESS.getRS()); ??

试试Action最后return null。
scbb 2012-08-15
  • 打赏
  • 举报
回复
FileInputStream in = new FileInputStream(file);


这个in对象没有关闭嘛。。。 貌似这个和你的问题没有关系。
Sammie 2012-08-15
  • 打赏
  • 举报
回复
我写过没出现你所出现的问题,把要close的close掉哦。

我试下你的代码看看
hucz08 2012-08-15
  • 打赏
  • 举报
回复
谢谢大家,问题总算解决了,但是不是各位所说的方法,其实 response.addHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");
以后就不需要再用out了,之后的操作删掉就好了,不过还是要谢谢各位了
scbb 2012-08-15
  • 打赏
  • 举报
回复
解决了嘛??

你把下面那句删了吧。
out.close();

换成
out.flush();

不关试试看。
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,求到达时运行其service方法,service方法自动派遣运行与求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个求,并且其实例一般不会销毁,而CGI对每个求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧