j2ee,jsp,servlet文件下载服务器端

1.getOutputStream() has already been called for this response

报错的原因:

使用tomcat容器调用response.getOutputStream()方法的时候只能够写二进制文件.

但调用requonse.getWriter()方法时,则只能够在前台打印文本文件.

所以:

如果在jsp页面:

outPutStream.flush();
outPutStream.close();
outPutStream=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();

这里out和pageContext是jsp的内置对象;

如果在后台:

如果使用response.getWrter,那么前面只能用response.setContentType("text/html");

如果想用二进制流的方式输出,那么就不都够使用response.setContentType("text/html");

如果是想传输文件,推荐:

response.setContentType("application/x-msdownload;charset=utf-8");

同时为了防止乱码,response.setCharacterEncoding("utf-8");

filename = URLEncoder.encode(filename, "utf-8");

文件下载的代码:

public void getDownLoadBook() throws IOException{
	response.setCharacterEncoding("utf-8");
	String filepath=request.getSession().getServletContext().getRealPath("\\") + "upload\\books\\";
	//通过前台bookId,从数据库中取出文件保存的信息
Book book=this.getBookService().getBook(bookId);
if(book==null)
	{       response.setContentType("text/html");
		PrintWriter writer=response.getWriter();
		writer.write("<html><body>");
		writer.write("此电子书不存在!");
		writer.write("</body></html>");
		writer.flush();
		writer.close();
		return;
	}
	String filename=book.getSaveName()+"";
	java.io.File file = new java.io.File(filepath + filename);
	if (!file.exists()) {
	         response.setContentType("text/html");
	         PrintWriter writer=response.getWriter();
	         writer.write("<html><body>");
		 writer.write("文件不存在!<br/>"+file.getAbsolutePath()+book.getOriginalName()+"不见了!");
		 writer.write("</body></html>");
		 writer.flush();
		 writer.close();
		 return;
		}
	response.setContentType("application/x-msdownload;charset=utf-8");
	response.setCharacterEncoding("utf-8");
	response.setContentLength((int) file.length());
	filename=book.getOriginalName();
	//编码文件名,防止乱码
	filename = URLEncoder.encode(filename, "utf-8");
	response.setHeader("Content-Disposition", "attachment; filename=" +filename);
	//得到输出流
        javax.servlet.ServletOutputStream out = response.getOutputStream();
	// 读取文件流
	java.io.FileInputStream fileInputStream = new java.io.FileInputStream(file);
	// 下载文件, 设置响应头和下载保存的文件名
	filename=book.getOriginalName();
	if (filename != null && filename.length() > 0) {
	if (fileInputStream != null) {
	int filelen = fileInputStream.available();
	文件太大时内存不能一次读出,要循环
	int i=4096;
	   do{
	      byte a[] = new byte[4096];
	      i=fileInputStream.read(a);
	      out.write(a, 0, i);
	     }while(i>=4096);
	}
	fileInputStream.close();
	out.flush();
	out.close();
		}
     }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 20:35:29

j2ee,jsp,servlet文件下载服务器端的相关文章

j2ee,jsp,servlet文件下载server端

1.getOutputStream() has already been called for this response 报错的原因: 使用tomcat容器调用response.getOutputStream()方法的时候仅仅可以写二进制文件. 但调用requonse.getWriter()方法时,则仅仅可以在前台打印文本文件. 所以: 假设在jsp页面: outPutStream.flush(); outPutStream.close(); outPutStream=null; respon

jsp servlet的区别和联系(转)

servlet是服务器端的程序,动态生成html页面发到客户端,但是这样 程序里有许多out.println(),java和html语言混在一起很乱.所以 后来推出了jsp.其实jsp就是servlet,每一个jsp在第一次运行时被 转换成servlet文件,再编译成.class来运行. 有了jsp,因此在MVC模式中servlet不再负责生成html页面,转而担任 控制程序逻辑的作用,控制jsp和javabean之间的流转. Servlet与Jsp的区别     * Servlet中没有内置对

JSP/Servlet基础语法

相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html http://blog.csdn.net/liaoxiaohua1981/article/details/6761053 http://computer.c.blog.163.com/blog/static/102524482012314537670/ http://ww

JSP/Servlet程序设计(入门书籍)

Web开发技术 1. 静态开发技术: (1)HTML      HTML是网站开发最基本的语言,是WEB的核心.所有后续的WEB开发技术都以HTML为基础. (2)CSS      CSS(Cascading Style Sheet)级联样式表. (3)JavaScript      JavaScript是一种基于对象和事件驱动的脚本语言.JavaScript程序可以直接嵌入HTML页面,作为一种客户端程序,允许用户与其进行交互. 2. 动态网页技术: 主要有ASP.ASP.NET.PHP和JS

J2EE:Servlet

1.JSP 9种隐式对象,以及他们的用途 JSP一共有9个隐式对象,分别是request,response,out分别代表请求,响应和输出 pageContext, session,applicationpageContext 代表当前页面作用域session 代表会话作用域application 代表全局作用域 configconfig可以获取一些在web.xml中初始化的参数,详见config对象page表示当前对象,详见page对象exception 表示异常对象,详见异常对象 2.ser

JSP/Servlet 工作原理

JSP/Servlet 工作原理(转载) 2014-03-08 23:20 1829人阅读 评论(0) 收藏 举报 Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器. Servlet 运行在 Servlet 容器中,并由容器管理从创建到销毁的整个过程. 对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和 ServletResponse对象

JSP/Servlet相关

1 简介 JSP(Java Server Page)和Servlet是JavaEE规范的两个基本成员,是JavaWeb开发的重点. JSP的本质是Servlet,当用户向指定的Servlet发送请求时,Servlet利用输出流动态的生成HTML页面,包括每一个静态的HRML标签和所有在HTMl页面中出现的内容. JSP页面内容由2个部分构成 静态部分:标准的HTML标签.静态的页面内容. 动态部分:受Java程序控制的内容,有Java脚本动态生成. 2 工作原理 1. JSP文件必须在JSP服务

jsp servlet的区别和联系

简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便. 后来SUN推出了类似于ASP的镶嵌型的JSP,把JSP TAG镶嵌到HTML语句中,这样,就大大简化和方便了网页的设计和修改.新型的网络语言如ASP,PHP,JSP都是镶嵌型的SCRIPT语言. JSP在本质上就是SERVLET,但是两者的创建方式不一样. Servlet完全是JAVA程序代码构成,擅长于流程控制和事务

【Web基础】JSP/Servlet 简单回顾

HTTP状态码: 2XX:请求成功 3XX:重定向 4XX:客户机中出现错误. 403-禁止--即使有授权也不需要访问.404 服务器找不到指定资源,文档不存在. 4XX:服务器出现错误.500 服务器内部错误--因为意外情况,服务器不能完成请求. JSP部分: JSP内置对象: 1 page Context --javax.servlet.jsp.PageContext 2.request--javax.servlet.http.HttpServletRequest 接口定义:public i