急!文件下载 Stream closed 的问题

yy2001 2008-01-10 01:12:22
下载文件时可以正常下载,但TOMCAT的日志中报:
2008-01-10 09:31:38 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.io.IOException: Stream closed
at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:202)
at org.apache.jasper.runtime.JspWriterImpl.clearBuffer(JspWriterImpl.java:157)
错误,请问怎么能不出现这个错误?
下载页面代码如下:
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>


<%
String pathname = request.getParameter("path");
String filename=request.getParameter("filename");
out.print(pathname+filename);

response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename="+filename);

FileInputStream fileInputStream =new FileInputStream(pathname+filename);
out.print(pathname+filename);
out.clear();
out.close();
ServletOutputStream myout=response.getOutputStream();
int i;
while ((i=fileInputStream.read()) != -1)
{myout.write(i);}
fileInputStream.close();
myout.close();

%>
...全文
612 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
eft21 2008-11-28
  • 打赏
  • 举报
回复
HAO SHOUCHANG
feiyu84 2008-05-13
  • 打赏
  • 举报
回复
5楼的说得好啊
老紫竹 2008-01-10
  • 打赏
  • 举报
回复
你可以尝试,把jsp最后面的所有空白都去掉 ,变成只有%>结尾,不要有任何空格和换行,而且以后也不要进行任何页面整理
及时是一个空格,jsp也要翻译成
out.print(" ");
而这时候out已经不能 print了
yy2001 2008-01-10
  • 打赏
  • 举报
回复
感谢回答,请问如果想在JSP中实现,如何避免这个异常呢?应为现在功能已经实现了,就是有这个异常,谢谢!
老紫竹 2008-01-10
  • 打赏
  • 举报
回复
因为tomcat在你的下载完成后,还有使用out这个东西,而他已经被你的response占用了,才报这个异常。

所以在jsp里面不建议用于下载,图片显示等与Stream有关的东西,那些放到servlet里面比较好。

一个显示图片的servlet供你参考,特别是后面的配置,可以让你的程序看上去还是在用.jsp 而不用修改你现在的程序了。

http://www.java2000.net/viewthread.jsp?tid=93
zhangli0803 2008-01-10
  • 打赏
  • 举报
回复
写个下载servlet 配置一下就能用了

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;

public class DownloadServlet extends HttpServlet {
private String contentType = "application/x-msdownload";
private String enc = "utf-8";
private String fileRoot = "";

public void init(ServletConfig config) throws ServletException {
String tempStr = config.getInitParameter("contentType");
if (tempStr != null && !tempStr.equals("")) {
contentType = tempStr;
}
tempStr = config.getInitParameter("enc");
if (tempStr != null && !tempStr.equals("")) {
enc = tempStr;
}
tempStr = config.getInitParameter("fileRoot");
if (tempStr != null && !tempStr.equals("")) {
fileRoot = tempStr;
}
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//String filepath = request.getParameter("filepath");
String filepath = "test.txt";
String fullFilePath = fileRoot + filepath;

File file = new File(fullFilePath);

if (file.exists()) {
String filename = URLEncoder.encode(file.getName(), enc);
response.reset();
response.setContentType(contentType);
response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
int fileLength = (int) file.length();
response.setContentLength(fileLength);

if (fileLength != 0) {

InputStream inStream = new FileInputStream(file);
byte[] buf = new byte[4096];

ServletOutputStream servletOS = response.getOutputStream();
int readLength;
while (((readLength = inStream.read(buf)) != -1)) {
servletOS.write(buf, 0, readLength);
}
inStream.close();
servletOS.flush();
servletOS.close();
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
FAT0708 2008-01-10
  • 打赏
  • 举报
回复
建议在finally里面关闭你的输入输出。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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