j2ee,jsp,servlet文件下載server端
阿新 • • 發佈:2017-07-01
filepath cati 方法 exce line article position book spa
這裏out和pageContext是jsp的內置對象;
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();
假設在後臺:
假設使用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端