php实现的支持断点续传的文件下载类

通常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现。

HTTP断点续传原理:

Http头 Range、Content-Range()
HTTP头中一般断点下载时才用到Range和Content-Range实体头,
Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300)
Content-Range用于响应头

请求下载整个文件:

GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219

Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头

一般正常回应:

HTTP/1.1 200 OK
Content-Length: 801     
Content-Type:
application/octet-stream
Content-Range: bytes 0-800/801 //801:文件总大小

FileDownload.class.php类文件代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

<?php 

/** php下载类,支持断点续传 

*  Date:  2013-06-30 

*  Author: test 

*  Ver:  1.0 

*  Func: 

*  download: 下载文件 

*  setSpeed: 设置下载速度 

*  getRange: 获取header中Range 

*/

  

class FileDownload{ // class start 

  

  private $_speed = 512;  // 下载速度 

  

  /** 下载 

  * @param String $file  要下载的文件路径 

  * @param String $name  文件名称,为空则与下载的文件名称一样 

  * @param boolean $reload 是否开启断点续传 

  */

  public function download($file, $name=‘‘, $reload=false){ 

    if(file_exists($file)){ 

      if($name==‘‘){ 

        $name = basename($file); 

      

  

      $fp = fopen($file, ‘rb‘); 

      $file_size = filesize($file); 

      $ranges = $this->getRange($file_size); 

  

      header(‘cache-control:public‘); 

      header(‘content-type:application/octet-stream‘); 

      header(‘content-disposition:attachment; filename=‘.$name); 

  

      if($reload && $ranges!=null){ // 使用续传 

        header(‘HTTP/1.1 206 Partial Content‘); 

        header(‘Accept-Ranges:bytes‘); 

          

        // 剩余长度 

        header(sprintf(‘content-length:%u‘,$ranges[‘end‘]-$ranges[‘start‘])); 

          

        // range信息 

        header(sprintf(‘content-range:bytes %s-%s/%s‘, $ranges[‘start‘], $ranges[‘end‘], $file_size)); 

          

        // fp指针跳到断点位置 

        fseek($fp, sprintf(‘%u‘, $ranges[‘start‘])); 

      }else

        header(‘HTTP/1.1 200 OK‘); 

        header(‘content-length:‘.$file_size); 

      

  

      while(!feof($fp)){ 

        echo fread($fp, round($this->_speed*1024,0)); 

        ob_flush(); 

        //sleep(1); // 用于测试,减慢下载速度 

      

  

      ($fp!=null) && fclose($fp); 

  

    }else

      return ‘‘

    

  

  

  /** 设置下载速度 

  * @param int $speed 

  */

  public function setSpeed($speed){ 

    if(is_numeric($speed) && $speed>16 && $speed<4096){ 

      $this->_speed = $speed

    

  

  

  /** 获取header range信息 

  * @param int  $file_size 文件大小 

  * @return Array 

  */

  private function getRange($file_size){ 

    if(isset($_SERVER[‘HTTP_RANGE‘]) && !empty($_SERVER[‘HTTP_RANGE‘])){ 

      $range = $_SERVER[‘HTTP_RANGE‘]; 

      $range = preg_replace(‘/[\s|,].*/‘, ‘‘, $range); 

      $range = explode(‘-‘, substr($range, 6)); 

      if(count($range)<2){ 

        $range[1] = $file_size

      

      $range = array_combine(array(‘start‘,‘end‘), $range); 

      if(empty($range[‘start‘])){ 

        $range[‘start‘] = 0; 

      

      if(empty($range[‘end‘])){ 

        $range[‘end‘] = $file_size

      

      return $range

    

    return null; 

  

} // class end 

  

?>

demo示例代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

<?php 

require(‘FileDownload.class.php‘); 

$file = ‘book.zip‘

$name = time().‘.zip‘

$obj = new FileDownload(); 

$flag = $obj->download($file, $name); 

//$flag = $obj->download($file, $name, true); // 断点续传 

  

if(!$flag){ 

  echo ‘file not exists‘

?>

断点续传测试方法:

使用linux wget命令去测试下载, wget -c -O file http://xxx

1.先关闭断点续传


1

$flag = $obj->download($file, $name);


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php 

--2013-06-30 16:52:44-- http://demo.test.com/demo.php 

正在解析主机 demo.test.com... 127.0.0.1 

正在连接 demo.test.com|127.0.0.1|:80... 已连接。 

已发出 HTTP 请求,正在等待回应... 200 OK 

长度: 10445120 (10.0M) [application/octet-stream

正在保存至: “test.rar” 

  

30% [============================>                                   ] 3,146,580  513K/s 估时 14s 

^C 

test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/demo.php 

--2013-06-30 16:52:57-- http://demo.test.com/demo.php 

正在解析主机 demo.test.com... 127.0.0.1 

正在连接 demo.test.com|127.0.0.1|:80... 已连接。 

已发出 HTTP 请求,正在等待回应... 200 OK 

长度: 10445120 (10.0M) [application/octet-stream

正在保存至: “test.rar” 

30% [============================>                                   ] 3,146,580  515K/s 估时 14s 

^C

可以看到,wget -c不能断点续传

2.开启断点续传


1

$flag = $obj->download($file, $name, true);


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php 

--2013-06-30 16:53:19-- http://demo.test.com/demo.php 

正在解析主机 demo.test.com... 127.0.0.1 

正在连接 demo.test.com|127.0.0.1|:80... 已连接。 

已发出 HTTP 请求,正在等待回应... 200 OK 

长度: 10445120 (10.0M) [application/octet-stream

正在保存至: “test.rar” 

  

20% [==================>                                        ] 2,097,720  516K/s 估时 16s 

^C 

test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/demo.php 

--2013-06-30 16:53:31-- http://demo.test.com/demo.php 

正在解析主机 demo.test.com... 127.0.0.1 

正在连接 demo.test.com|127.0.0.1|:80... 已连接。 

已发出 HTTP 请求,正在等待回应... 206 Partial Content 

长度: 10445121 (10.0M),7822971 (7.5M) 字节剩余 [application/octet-stream

正在保存至: “test.rar” 

  

100%[++++++++++++++++++++++++=========================================================================>] 10,445,121  543K/s  花时 14s   

  

2013-06-30 16:53:45 (543 KB/s) - 已保存 “test.rar” [10445121/10445121])

时间: 2024-10-10 00:07:02

php实现的支持断点续传的文件下载类的相关文章

php 支持断点续传的文件下载类

php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现. HTTP断点续传原理Http头 Range.Content-Range()HTTP头中一般断点下载时才用到Range和Content-Range实体头,Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-3

Java单线程文件下载,支持断点续传功能

前言: 程序下载文件时,有时会因为各种各样的原因下载中断,对于小文件来说影响不大,可以快速重新下载,但是下载大文件时,就会耗费很长时间,所以断点续传功能对于大文件很有必要. 文件下载的断点续传: 1.先下载临时文件,用于记录已下载大小:     2.http请求时设置Range参数       3.下载此次请求的数据: 直接上代码: 1 package com.test.service; 2 3 import java.io.File; 4 import java.io.InputStream;

一个简单Android下载管理器的实现(支持断点续传)

近期工作不是很忙,时间比较多,所以在空闲时间准备自己编写一个简单的Android下载管理器.该管理器实现如下功能: 1.能够支持正常的下载,暂停,继续,安装操作. 2.支持断点续传,实现暂停继续功能,在推出应用后,再次进入应用依然能正常将文件下载完成. 3.实现实时状态回调,下载进度,速度,一目了然. 以上是UML设计图,这个简单下载器的实现,有几个技术难点,攻克它们问题就迎刃而解. 1.如何实现断点续传:这个问题其实不难,网上也有很多相关资料,基本原理都相同,就是记录下载任务上一次中断的位置,

自己写的一个简单的迅雷下载支持断点续传

当我学习了网络线程,就自己仿照迅雷下载写了一个下载器,支持断点续传 我用的是SWT插件做的界面 界面 package com.yc.xunlei; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Arra

【FTP】FTP文件上传下载-支持断点续传

Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常用)]和[ASCII_FILE_TYPE]两种; 数据连接模式:一般使用LocalPassiveMode模式,因为大部分客户端都在防火墙后面: 1. LocalPassiveMode:服务器端打开数据端口,进行数据传输: 2. LocalActiveMode:客户端打开数据端口,进行数据传输: 系统

C# http下载(支持断点续传)

分享下项目里面自己封装的一个http下载类 功能如下: 1.支持断点续传 2.下载失败自动重试 3.超时等异常处理 using System; using System.Collections.Generic; using System.IO; using System.Net; public class HttpManager { const int bytebuff = 1024; const int ReadWriteTimeOut = 2 * 1000;//超时等待时间 const in

FileDown(文件下载类)

using System;using System.IO;using System.Threading;using System.Web; /// <summary>/// 文件下载类/// </summary>public class FileDown{    public FileDown()    { } /// <summary>    /// 参数为虚拟路径    /// </summary>    public static string Fil

ceph储存的S3接口实现(支持断点续传)

最近公司准备接ceph储存,研究了一番,准备用亚马逊的s3接口实现,实现类如下: /** * Title: S3Manager * Description: Ceph储存的s3接口实现,参考文档: * https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/RetrievingObjectUsingJava.html * http://docs.ceph.org.cn/radosgw/s3/ * author: xu jun * date: 2

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传) 网络ios文件管理器attributespathurl 在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐.下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://blog.csdn.net/pjk1129/article/details/6575588中有具体的介绍,今天重点介绍如何实现,废话少说,开始