jspSmartUpload组件实现下载出现异常, 求教,谢。

tem.html

点击下载

upload_action.jsp
<%
String load_path=null;//文件路径
//String file_name=new String(request.getParameter("file_name").getBytes("ISO-8859-1"));
//out.println(file_name);

//if(null==file_name)response.sendRedirect("error.jsp");
//load_path="upload/"+file_name;
load_path="upload/新建文本文档 (3).txt";
out.println(load_path);

SmartUpload su = new SmartUpload();

su.initialize(pageContext);

su.setContentDisposition(null);
    // 下载文件
su.downloadFile(load_path);

%>

出现的异常:
org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:610)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
org.apache.jsp.file_005fopration.file_005fload_jsp._jspService(file_005fload_jsp.java:95)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

谢谢。。
[b]问题补充:[/b]
没。。 我重启TOMCAT, 然后就上面两个文件, 也出现上面的异常。
[b]问题补充:[/b]
呵呵。。 初学。。 书上看的用下。。
[b]问题补充:[/b]
貌似看的书老了,, 还是自己写个类直接实现好。。。 谢谢大家的回答。。

这是因为服务器会向response中写东西造成的,解决方式是将下面代码的此句response.reset();的注释打开,这样在使用response时先将其重置。

[code="java"]
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%
//response.reset();
//filePath为全路径:D:/upload/a.doc
String path = request.getParameter("filePath");
int k = path.lastIndexOf("/");
String name = path.substring(k + 1 , path.length());
response.setContentType("unknown");
response.addHeader("Content-Disposition","filename=\"" + name + "\"");
try {
OutputStream os = response.getOutputStream();
FileInputStream fis = new FileInputStream(path);
byte[] b = new byte[1024];
int i = 0;
while((i = fis.read(b)) > 0) {
os.write(b, 0 ,i);
}
fis.close();
os.flush();
os.close();
} catch(Exception e) {
e.printStackTrace();
}
%>[/code]

你是不是代码里已经调用了response.getOutputStream()
或是response.getWriter()

6年过去了,还有人在这个。
注释掉
[code="java"]out.println(load_path); [/code]

修改
[code="java"]su.setContentDisposition(null); [/code]


[code="java"]su.setContentDisposition("attachment; filename=abc.txt"); [/code]

不过我没有试过,以前最早的是用过aspSmartUpload写ASP文件上传,后来才用jspSmartUpload,知道了cos,commons-fileupload之后,就再也没有用过了。
对于下载,根本就没有必要这个东西,自己实现也很简单。
只要将字节流输出到页面,设置Content type 和 ContentDisposition 两个header参数就可以实现下载。
现在的web的框架都作了不同程序的封装,更简单了。

那就要干掉out.println(load_path); 这行代码应该就没问题了

其实这个异常的意思就是
response.getOutputStream() 和 response.getWriter()是不能在同一次请求里调用的