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;
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-05 14:44:16

j2ee,jsp,servlet文件下载server端的相关文章

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

Eclipse JSP/Servlet 环境搭建

Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装,可参阅 Java 开发环境配置. 我们可以使用 Eclipse 来搭建 JSP 开发环境,首先我们分别下载一下软件包: Eclipse J2EE:http://www.eclipse.org/downloads/ Tomcat:http://tomcat.apache.org/download-70.cgi Tomcat 下载安装 你可以根据你的系统下载对应的包(以下以Window系统为例): 下载之后

JSP/SERVLET新手教程--Servlet 使用入门

如今的JSP书籍有的是直接讲述JSP的使用,然后再解说SERVERLET的使用;也有书籍是先讲述SERVERLET的使用,然后解说JSP使用.个人觉得另外一种相对好一些,至于原因大家能够在学习体会到!所以今天我们接着学习SERVERLET的使用! 好,废话少说,如今開始! 什么是Servlet? ① Servlet就是JAVA 类 ② Servlet是一个继承HttpServlet类的类 ③ 这个在server端执行,用以处理client的请求 Servlet相关包的介绍 --javax.ser

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

JSP/Servlet Web 学习笔记 DayFour

Servlet概述 Servelt是使用Java Servlet应用程序接口及相关类和方法的Java程序. Servlet是用Java编写的Server端程序,它与协议和平台无关.Servlet运行于Java服务器中. Java Servlet API 定义了Servlet和服务器之间的标准接口,这使得Servlet具有跨服务器平台的特性. 通常,Servlet采用一种无状态的“请求-响应”模型来访问.它能处理客户端传来的Http请求,从中提取参数,处理业务逻辑,最终返回数据或输出HTML.它还

Drcom账户管理Server端解说

https://www.github.com/xiyouMc 首先今天要讲的是针对Drcom查询账户URL的解析和抓取数据.    Drcom是大学生宿舍上网普遍使用的联网client,然而对于自己账号的信息查询和改动password等都没有提供一个合理的方式去解决,因此小弟尝试去编写实现移动端的 app以方便大学生针对自己drcom账户的管理. 架构由来和设计 刚開始我是想直接基于某公司开发的b/s架构去实现client,然而当我去了解该B/S架构的时候才发现去实现C和B/S的架构不合理.为什

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

cas server端的login-webflow详细流程

login-webflow是当你在浏览器里面输入https://uia.comsys.net.cn/login?param_list 后,cas server端如何处理的. 它实际上是spring-webflow的应用 有关spring-webflow的详细介绍, 网上铺天盖地,我就不啰嗦了 cas server端的web.xml文件里面有 <servlet>  <servlet-name>cas</servlet-name>  <servlet-class>

Drcom账户管理Server端讲解

首先今天要讲的是针对Drcom查询账户URL的解析和抓取数据.    Drcom是大学生宿舍上网普遍使用的联网客户端,然而对于自己账号的信息查询和修改密码等都没有提供一个合理的方式去解决,因此小弟尝试去编写实现移动端的 app以方便大学生针对自己drcom账户的管理. 架构由来和设计 刚开始我是想直接基于某公司开发的b/s架构去实现客户端,然而当我去了解该B/S架构的时候才发现去实现C和B/S的架构不合理.为什么不合理呢?因为该B/S架构中当然使用到session机制和图片验证机制等等的,要在移