1 /**
2 * 重新设置http response参数,使之支持断点续传.
3 *
4 * @param fileLength
5 * 文件长度.
6 * @throws IOException
7 *
8 */
9 private void resetResponse(long fileLength) throws IOException {
10 long p = 0;
11 long l = fileLength;
12
13 ServletActionContext.getResponse().reset();
14 // 告诉客户端允许断点续传多线程连接下载
15 // 响应的格式是:
16 // Accept-Ranges: bytes
17
18 ServletActionContext.getResponse().setHeader("Accept-Ranges", "bytes");
19 // 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置
20 // 响应的格式是:
21 // HTTP/1.1 200 OK
22
23 if (ServletActionContext.getRequest().getHeader("Range") != null) // 客户端请求的下载的文件块的开始字节
24 {
25
26 ServletActionContext.getResponse().setStatus(
27 javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);
28 p = Long.parseLong(ServletActionContext.getRequest().getHeader(
29 "Range").replaceAll("bytes=", "").replaceAll("-", ""));
30 }
31
32 //如果设设置了Content-Length,则客户端会自动进行多线程下载。如果不希望支持多线程,则不要设置这个参数。
33 // 响应的格式是:
34 // Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
35 // ServletActionContext.getResponse().setHeader("Content-Length",
36 // new Long(file.length() - p).toString());
37
38 if (p != 0) {
39
40 // 不是从最开始下载,
41 // 响应的格式是:
42 // Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
43 String contentRange = new StringBuffer("bytes ")
44 .append(new Long(p).toString())
45 .append("-")
46 .append(new Long(l - 1).toString())
47 .append("/")
48 .append(new Long(l).toString())
49 .toString();
50 ServletActionContext.getResponse().setHeader("Content-Range",
51 contentRange);
52 LogService.info("Content-Range is : " + contentRange);
53 }
54
55 _fileStream.skip(p);
56
57 }
正如代码所示,实现断点续传和多线程下载的关键在于对response的参数进行设置。
posted on 2007-04-03 09:04
OO 阅读(4280)
评论(2) 编辑 收藏 所属分类:
java相关的乱七八糟的东西