package com.demo; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; public class DownloadServlet extends HttpServlet { public static Logger log = Logger.getLogger(DownloadServlet.class); private static final long serialVersionUID = 1L; /** * 实验:下载功能,当用户点击下载,弹出“保存,取消”的框后,如果用户不做任何点击,<br> * 此时,服务器servlert的out.write是会hold住吗? 还是能继续输出? * http://topic.csdn.net/u/20110915/09/7f162e68-7632-4985-9aab-920bb06df2cc * .html?seed=1489779347&r=75525057#r_75525057 * * 飞飞说,应该是cache在操作系统中(Socket内核相关)。我write了260M数据,看到java占用内存还是70M,所以确实有可能。 */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应头信息,下载的文件 String contentType = "application/octet-stream;charset=GBK"; String contentDisposition = "attachment; filename=\"demo.txt\""; response.setContentType(contentType); response.setHeader("Content-disposition", contentDisposition); //response buffer log.error(response.getBufferSize()); response.setBufferSize(1); log.error(response.getBufferSize()); OutputStream os = response.getOutputStream(); PrintWriter pw = new PrintWriter(os); Long i = 0L; while (i++ < 10000000L) {// 260M的文件 pw.println("some test content.........");// pw.flush(); } pw.close(); // response. // 即使不点击“保存”,也不会hold住,会继续输出下列log。而且,隔了30分钟后再点击“保存”,竟然还能下载成功。 log.error("outputstream closed! come here!"); } }
?
demo见附件。
?
?
结论:
曹帅解答了我的疑惑,只要用户点击了下载资源的Url,无论用户是否点击“保 存”,浏览器会马上开始下载完整的response的(使用httpfox看确实是这样,我没点击“保存”它就已经下载完文件了),不管你是否点击保存, 保存的行为只是浏览器将下载完或正在下载的内容存到用户指定的文件中而已。( 再说,HTTP协议本身就是request/response,不可能还能根据用户是否点击保存的行为而Hold住的。) 同时,想想wget,是直接就下载吧,没有hold的。
?