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

最新文章

  1. websocket
  2. 802.1X基础
  3. JavaScript DOM 编程艺术&#183;setInterval与setTimeout的动画实现解析
  4. 在MFC中,使用控制台Console输出调试信息
  5. ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版
  6. .net社区
  7. php无限遍历目录-修正版
  8. hosts代理
  9. 导师互选系统 Alpha版冲刺总结
  10. Meditation Guide
  11. clientX,pageX,screenX,offsetLeft,scrollTop
  12. AlarmManager类的应用
  13. c++ 静态多态与动态多态
  14. 金色的 SQL注意事项(1)
  15. 实现自动登录:Filter 实现思路和方式
  16. python Is 与== 的坑
  17. 创建github仓库的gh-pages分支
  18. SQL Server 创建跨库查詢、修改、增加、删除
  19. AutoStartUtil【打开自启动设置界面】
  20. SignarL服务器端发送消息给客户端的几种情况

热门文章

  1. Felx之菜单导航
  2. 客户端本地存储(cookie、web Storage、vuex)选择
  3. 简单学习Python之路1
  4. Scrapy框架之日志等级
  5. vue踩坑-Error: listen EADDRNOTAVAIL 192.168.1.122:8081
  6. mongodb适用和不适用的应用场景
  7. SQL两表之间:依据一个表的字段更新还有一个表的字段
  8. 基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理
  9. Statement和ResultSet
  10. PHP 获取完整URL地址