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();
}
}

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

  1. JS.中文乱码,Jsp\Servlet端的解决办法

    JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21|  分类: Extjs |  标签:encodeuricomponent  乱码  urldecoder   ...

  2. Eclipse JSP/Servlet 环境搭建

    Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装,可参阅 Java 开发环境配置. 我们可以使用 Eclipse 来搭建 JSP 开发环境,首先我们分别下载 ...

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

    如今的JSP书籍有的是直接讲述JSP的使用,然后再解说SERVERLET的使用;也有书籍是先讲述SERVERLET的使用,然后解说JSP使用.个人觉得另外一种相对好一些,至于原因大家能够在学习体会到! ...

  4. JSP-Runood:Eclipse JSP/Servlet 环境搭建

    ylbtech-JSP-Runood:Eclipse JSP/Servlet 环境搭建 1.返回顶部 1. Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装 ...

  5. JSP/Servlet基础语法

    相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...

  6. JSP/Servlet 中的汉字编码问题

    JSP/Servlet 中的汉字编码问题 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区 ...

  7. JSP&Servlet学习手册

    JSP&Servlet学习手册 沙琪玛 书 目录 JSP 指令... 3 书写方式... 3 指令列表... 3 JSP 内置对象... 3 内置对象特点... 3 常用内置对象... 3 o ...

  8. Java Web 开发的JavaBean + Servlet + Sql Server

    日期:2018.12.9 博客期:026 星期日 我知道对于每个人都需要对开发web进行了解,而我们常用的技术,也应该有所了解 /*<------------------->*/知识点: ...

  9. 软件架构设计学习总结(18):MVC三层架构在各框架(jsp+servlet + Struts1+ Struts2+ springMVC)中的特征

    1.基于web开发中最原始的jsp+Servlet   图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet ...

随机推荐

  1. python3之开发环境PyCharm配置

    1. 安装PyCharm(安装时注意选择python),地址: https://www.jetbrains.com/pycharm/ 2. 安装python 地址: https://www.pytho ...

  2. react-native使用androidstudio时,安卓模拟器reload菜单界面显示快捷键ctrl+M;

    react-native使用androidstudio时,安卓模拟器reload菜单界面显示快捷键ctrl+M:

  3. 【Linux下用户和组管理】

    创建用户--useradd . 命令格式:useradd [参数] 用户名 useradd也可写成adduser . 参数如下 -u 指定UID号 -d 指定宿主目录 -e 指定生效时间 -g 指定基 ...

  4. 【Django】模板系统

    目录 一.变量 二.过滤器 Filters 2. length 3. filesizeformat 4. slice 5. add 6. first.last 7. join 8. truncatec ...

  5. 【Codeforces Round #460 (Div. 2) A】 Supermarket

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 就是让你求m*(ai/bb)的最小值 [代码] #include <bits/stdc++.h> #define dou ...

  6. ASP.NET通过JavaScript实现Button 的Enabled=false

    正常代码控制无法满足需求,所以记录一下方法: <input id="Button5" onclick=" CX()" type="button& ...

  7. button-xml 中android:clickable="false" 属性

    今天在做项目的时候,遇到了一个问题,就是需要把一个常按监听事件,加到一个linearlayout中,但是,这个linearlayout中有其他的button.textview等控件,这样就导致当我们常 ...

  8. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  9. python自学群里遇到的小题汇总

    题目一: 请使在3秒内计算出一组的数据,偶数在奇数前(注意不使用for while等循环的方法)格式如下1,2,3,4,5,6,7,8,9,10输出结果是2,1,4,3,6,5,8,7,10,9 解决 ...

  10. Install Docker Mac OS X

    检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker 安装 Boot2Docker 列表内容 下载地址: ...