纸飞机

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 28 文章 :: 30 评论 :: 0 Trackbacks
用jspsmart下载文件异常(tomcat正常,weblogic不行)

用jspsmart下载文件JSP代码如下:
<%@ page contentType="text/html;charset=GBK" import="com.jspsmart.upload.*" %><%
//取得服务器存放文件的路径
String reportTemplatePath = (String)session.getAttribute("reportTemplatePath");
//文件名
String filename = reportTemplatePath + "/" + request.getParameter("filename");
filename = new String(filename.getBytes(),"ISO-8859-1");
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 初始化
su.initialize(pageContext);
//设定contentDisposition为null以禁止浏览器自动打开文件,保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
su.setContentDisposition(null);
// 下载文件
su.downloadFile(filename);
%>在tomcat中运行正常。
在weblogic中运行抛出如下异常.
文件可以下载,但特别慢并且打开是乱码。
<2004-2-19 下午09时14分34秒> <Error> <HTTP> <101019> <[ServletContext(id=325867,
name=csrc,context-path=/csrc)] Servlet failed with IOException
java.net.ProtocolException: Exceeded stated content-length of: '548352' bytes
        at weblogic.servlet.internal.ServletOutputStreamImpl.checkCL(ServletOutp
utStreamImpl.java:220)
        at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutput
StreamImpl.java:170)
        at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:986)
        at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:355)
        at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:336)
        at jsp_servlet._test.__do_download._jspService(__do_download.java:102)
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:27)
        at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run
(ServletStubImpl.java:1058)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:401)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:306)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationActio
n.run(WebAppServletContext.java:5445)
        at weblogic.security.service.SecurityServiceManager.runAs(SecurityServic
eManager.java:780)
        at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppSe
rvletContext.java:3105)
        at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestIm
pl.java:2588)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189)
>

解决方法:把所有<%和%>之外的空格字符都取掉就好了.参考如下:
<%@ page contentType="text/html;charset=GBK" import="com.jspsmart.upload.*" %><%
//取得服务器存放文件的路径
String reportTemplatePath = (String)session.getAttribute("reportTemplatePath");
//文件名
String filename = reportTemplatePath + "/" + request.getParameter("filename");
filename = new String(filename.getBytes(),"ISO-8859-1");
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 初始化
su.initialize(pageContext);
//设定contentDisposition为null以禁止浏览器自动打开文件,保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
su.setContentDisposition(null);
// 下载文件
su.downloadFile(filename);
%>

 

posted on 2008-06-02 16:04 纸飞机 阅读(3776) 评论(2)  编辑  收藏

评论

# re: 用jspsmart下载文件异常(tomcat正常,weblogic不行) 2008-06-02 16:50 隔叶黄莺
留个印象,还是 Tomcat 的兼容性较强。
记得原来写个 jsp 的注释写成了
<%-- 注释 ---%>

在 tomcat 下通过,但放在 WAS 下报错了,原因是 WAS 下要写成

<%-- 注释 --%>

WAS 愣是那么古板,多个横线就要了它的命。  回复  更多评论
  

# re: 用jspsmart下载文件异常(tomcat正常,weblogic不行) 2008-06-02 20:05 BeanSoft
JSP 文件下载的相对完整代码(解决中文问题和Weblogic报错)
http://www.blogjava.net/beansoft/archive/2007/02/01/97294.html

<%
// String filePath = "c:/文档.doc";
// 如果是 WEB APP 下的相对路径文件, 请使用下列代码:
String filePath = application.getRealPath( " 测试文档.htm " );
boolean isInline = false ; // 是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,
// 那么文件将被打开, 否则会提示下载)

// 清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去
// 如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错
// java.lang.IllegalStateException: getOutputStream() has already been called for
// this response,
out.clear();

// {{{ BEA Weblogic 必读
// 修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题
// 关于文件下载时采用文件流输出的方式处理:
// 加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
// 因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
// 而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
// 就会发生:getOutputStream() has already been called for this response的错误
// 详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
// 而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
// 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。
// 同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去
response.reset();
// }}}

其它代码照旧  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: