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的参数进行设置。
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的参数进行设置。
http://www.blogjava.net/123xxx/archive/2007/07/23/108116.html