This article describes the file download class implemented by PHP that supports breakpoint resume download and its usage. It is a very practical technique. Share it with everyone for your reference. The specific method is as follows:
Generally speaking, PHP supports breakpoint resumption, mainly relying on the header HTTP_RANGE in the HTTP protocol.
HTTP breakpoint resumption principle:
Http header Range, Content-Range() Range and Content-Range entity headers are generally used in HTTP headers only for breakpoint downloads. In the Range user request header, specify the position of the first byte and the last byte. The position like (Range: 200-300) Content-Range is used for the response header
Request to download the entire file:
GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //General request to download the entire file is bytes=0- or do not use this header
Normal response:
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801: Total file size
FileDownload.class.php class file code is as follows:
- /**
- * Download class, supports resumed downloads
- * @time: 2015 06 30 09:36
- * @author:guoyu@xzdkiosk.com
- * PHP download class, supports resumed downloads
- * Func:
- * download: Download file
- * setSpeed: Set the download speed
- * getRange: Get the Range in the header
- */
-
- class FileDownload{ // class start
-
- private $_speed = 512; // Download speed
-
- /**Download
- * @param String $file The path of the file to be downloaded
- * @param String $name The file name, if it is empty, it will be the same as the downloaded file name
- * @param boolean $reload Whether to enable breakpoint resumption
- */
- 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){ // Use resume
- header('HTTP/1.1 206 Partial Content');
- header('Accept-Ranges:bytes');
-
- // Remaining length
- header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));
-
- // range information
- header(sprintf('content-range:bytes % s-%s/%s', $ranges['start'], $ranges['end'], $file_size));
-
- // The fp pointer jumps to the breakpoint position
- 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); // For testing, minus Slow download speed
- }
-
- ($fp!=null) && fclose($fp);
-
- }else{
- return '';
- }
- }
-
- /**Set download speed
- * @param int $speed
- */
- public function setSpeed( $speed){
- if(is_numeric($speed) && $speed>16 && $speed<4096){
- $this->_speed = $speed;
- }
- }
-
- /**Get header range information
- * @param int $file_size 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
-
- ?>
Copy code
The demo code is as follows:
- require('FileDownload.class.php');
- $file = 'book.zip';
- $name = time().'.zip';
- $obj = new FileDownload();
- $flag = $obj->download($file, $name);
- //$flag = $obj->download($file, $name, true); // Resume upload from breakpoint
-
- if(!$flag){
- echo 'file not exists';
- }
- ?>
Copy code
Test method for resumable download:
Use the linux wget command to test the download, wget -c -O file http://xxx
1. Turn off breakpoint resumption first
- $flag = $obj->download($file, $name);
Copy code
- 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
- Resolving host demo.test.com... 127.0.0.1
- Connecting demo.test.com|127.0.0.1|:80... Connected.
- HTTP request sent, waiting for response... 200 OK
- Length: 10445120 (10.0M) [application/octet-stream]
- Saving to: “test.rar”
-
- 30% [====== ======================> ] 3,146,580 513K/s Estimated time 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
- Resolving host demo.test .com... 127.0.0.1
- Connecting demo.test.com|127.0.0.1|:80... Connected.
- HTTP request sent, waiting for response... 200 OK
- Length: 10445120 (10.0M) [application/octet-stream]
- Saving to: “test.rar”
- 30% [======== =====================> ] 3,146,580 515K/s Estimated time 14s
- ^C
Copy code
You can see that wget -c cannot resume the upload
2. Enable breakpoint resumption
- $flag = $obj->download($file, $name, true);
Copy code
- 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
- Resolving host demo.test.com... 127.0.0.1
- Connecting demo.test.com|127.0.0.1|:80... Connected.
- HTTP request sent, waiting for response... 200 OK
- Length: 10445120 (10.0M) [application/octet-stream]
- Saving to: “test.rar”
-
- 20% [====== ============> ] 2,097,720 516K/s Estimated time 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
- Resolving host demo.test.com... 127.0.0.1
- Resolving Connect demo.test.com|127.0.0.1|:80... Connected.
- HTTP request sent, waiting for response... 206 Partial Content
- Length: 10445121 (10.0M), 7822971 (7.5M) Bytes remaining [application/octet-stream]
- Saving to: “test.rar”
-
- 100%[++++++++++++++++++++++++====================== ================================================== ]
- You can see that the download will start from the breakpoint position (%20).
-
From: http://blog.csdn.net/phpfenghuo/article/details/46691865
Resume upload from breakpoint, php
|