项目中用到了jspSmartUpload包
在使用downloadFile方法时经常出现这样的错误:java.lang.IllegalStateException: getOutputStream() has already been called for this response
出现这个错误有两种情况
一:(自己懒的写了 直接转的joeyta@Matrix 的话 详见:http://www.matrix.org.cn/thread.shtml?topicId=23441&forumId=14)
因为jsp转译成servlet时,当有输出就会使用getWriter().
它是javax.servlet.jsp.JspWriter类型(extends java.io.Writer).
而getOutputStream().
它是javax.servlet.ServletOutputStream类型(extends java.io.OutputStream).
而对客户端的输出只能使用一种类别输出.
当它在jsp里使用了getOutputStream().
就会产生了两种类别输出,所以就会形成冲突.program根本不知道你要使用那一个作为输出.
一般在下载档案时都要使用getOutputStream().对客户端串流输出.
使用jsp作为下载档案时,
在jsp档案里,不能有任何的输出.
包括空格或out.println("xxx");
因为会使用了jspWriter().
所以使用jsp作为下载档案时.
检查一下{Tomcat_home}/work/xxx/xxx_jsp.java
看它到底在那里使用了JspWriter.
把它修正,就能解决问题.
二:是jspSmartUpload包自身的BUG
如果要下载的文件过小(只有几K) 也会出现上面的错误
解决方法:将包中的SmartUpload.class文件反编译成.java
在public void downloadFile(String sourceFilePathName, String contentType, String destFileName, int blockSize)throws IOException, ServletException这个方法的
while((long)totalRead < fileLen)
{
readBytes = fileIn.read(b, 0, blockSize);
totalRead += readBytes;
m_response.getOutputStream().write(b, 0, readBytes);
(这里)
}
加上if (this.getSize() <= 64 * 1024) {
m_response.flushBuffer();
}
就应该ok了
还有就是网上有一篇流传很广的介绍jspSmartUpload包使用方法的文章:
《jspSmartUpload上传下载全攻略》
其中downloadFile例程如下:
<%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %><% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(pageContext); // 设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开它。扩展名为pdf时, //浏览器将用acrobat打开。 su.setContentDisposition(null); // 下载文件 su.downloadFile("/upload/如何赚取我的第一桶金.doc"); %> |
这个程序我调试没有通过 su.initialize(pageContext); 这句会报错
而且下面还有这样的说法:
注意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。
我参考了一下其他的文档 采用了这种写法:
<%
mySmartUpload.init(config);
mySmartUpload.service(request,response);
mySmartUpload.setContentDisposition("inline;");
mySmartUpload.downloadFile("xxx.doc");
%>
运行通过 并且没有什么所谓的不能包含空格 回车 换行等说法
可能是包的版本不一样吧