随笔-5  评论-41  文章-13  trackbacks-0
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 阅读(4251) 评论(2)  编辑  收藏 所属分类: java相关的乱七八糟的东西

评论:
# 有不明白的问题 2007-04-24 18:00 | 彭兵
是不是我要写一个页面接收下载软件的请求呀...然后由下载软件来传这个long fileLength参数吗?  回复  更多评论
  
# re: 使java服务器端支持断点续传 2007-07-23 10:53 | OO
fileLength是由你的程序读取需要下载的文件获取的,并不是由下载软件来传。
客户端请求的开始点和块大小在
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 }

这个部分来获取  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: