关于一个JSP文件下载问题,运行时发生异常。请各位高手求教!

异常如下:严重:Servlet.service()forservlet[jsp]incontextwithpath[/share]threwexception[java.... 异常如下:
严重: Servlet.service() for servlet [jsp] in context with path [/share] threw exception [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response

JSP程序如下:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,java.io.*"%>
<%request.setCharacterEncoding("gb2312"); %>
<html>
<head>
<title>文件下载处理页面</title>
</head>
<body>
<%
String te;
String type=request.getParameter("type");//获取文件类型
byte b[]=type.getBytes("ISO-8859-1");
type=new String(b);
if(type.equals("软件"))
te="software";
else if(type.equals("视频"))
te="video";
else if(type.equals("歌曲"))
te="song";
else if(type.equals("文档"))
te="document";
else
te="other";
String filename=request.getParameter("filename");//获取文件名
b=filename.getBytes("ISO-8859-1");
filename=new String(b);
String owner=request.getParameter("owner");//获取文件上传者
b=owner.getBytes("ISO-8859-1");
owner=new String(b);
String username=(String)session.getAttribute("id");//获取下载用户名
int integral=Integer.parseInt(request.getParameter("integral"));//获取下载所需积分

OutputStream o=response.getOutputStream();//获取输出流对象
int buffersize=5000;
byte buffer[]=new byte[buffersize];
File downloaddir=new File("G:\\Tomcat\\Webroot\\jsp\\resource\\WebRoot\\resource\\"+te+"\\");//创建文件夹对象,该文件夹存放资源
File download=new File(downloaddir,filename);//创建资源文件对象
response.setHeader("Content_disposition","attachment;filename="+filename);
response.setContentType(type);//设置文件类型
response.setHeader("Content_length",download.length()+"");//设置文件大小
FileInputStream in=new FileInputStream(download);
int count;
while((count=in.read(buffer))!=-1)
o.write(buffer, 0, count);//输出数据
in.close();
o.close();
%>
</body>
</html>
展开
 我来答
鼻涕一米二
2012-07-02 · TA获得超过816个赞
知道小有建树答主
回答量:460
采纳率:100%
帮助的人:260万
展开全部
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。
解决办法:
在使用完输出流以后调用以下两行代码即可:(你在o.close()之后添加)
out.clear();
out = pageContext.pushBody();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友489295667
2012-07-02 · TA获得超过2367个赞
知道小有建树答主
回答量:1471
采纳率:80%
帮助的人:295万
展开全部
OutputStream o=response.getOutputStream();//获取输出流对象
。。。。。。。。。。。

response.setHeader("Content_disposition","attachment;filename="+filename);
response.setContentType(type);//设置文件类型
response.setHeader("Content_length",download.length()+"");//设置文件大小
设置response应该在response获得输出流之前调用。
也就是将下面三句挪到上面一句的前面。
追问
按照你的去改正后,还是出现同样的错误。谢谢你的回答
追答
那还有可能就是,你这是jsp程序,
response输出流调用之后,网页的其他内容也要调用response输出到浏览器。
两次response输出,所以出问题了。
把你的jsp程序改成servlet试试。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式