使用jspSmartUpload包需要注意的问题

项目中用到了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");

%>

运行通过 并且没有什么所谓的不能包含空格 回车 换行等说法

可能是包的版本不一样吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值