Heim  >  Artikel  >  Backend-Entwicklung  >  Erläutern Sie den zugehörigen Inhalt der PHP-Datei-Download-Klasse, die die Übertragung von Breakpoint-Lebensläufen unterstützt

Erläutern Sie den zugehörigen Inhalt der PHP-Datei-Download-Klasse, die die Übertragung von Breakpoint-Lebensläufen unterstützt

jacklove
jackloveOriginal
2018-06-11 09:39:541620Durchsuche

php unterstützt die Wiederaufnahme von Haltepunkten und stützt sich dabei hauptsächlich auf den Header HTTP_RANGE im HTTP-Protokoll.
HTTP-Breakpoint-Resume-Download-Prinzip
Http-Header-Bereich, Content-Range()
Bereich und Inhalt werden nur für allgemeine Breakpoint-Downloads im HTTP-Header verwendet - Bereichsentitätsheader,
Geben Sie im Bereichsbenutzeranforderungsheader die Position des ersten Bytes und die Position des letzten Bytes an, z. B. (Bereich: 200-300).
Content-Range wird für den Antwortheader verwendet
Anfrage zum Herunterladen der gesamten Datei:
GET /test.rar HTTP/1.1
Verbindung: schließen
Host: 116.1.219.219
Bereich: Bytes=0-801 //Allgemeine Anfragen an Laden Sie die gesamte Datei herunter, sind Bytes =0- oder verwenden Sie diesen Header nicht
Normale Antwort
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: Bytes 0 -800/801 //801: Gesamtdateigröße

FileDownload.class.php

<?php
/** php下载类,支持断点续传
*   Date:   2013-06-30
*   Author: fdipzone
*   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=&#39;&#39;, $reload=false){
        if(file_exists($file)){
            if($name==&#39;&#39;){
                $name = basename($file);
            }
            $fp = fopen($file, &#39;rb&#39;);
            $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(&#39;start&#39;,&#39;end&#39;), $range);
            if(empty($range[&#39;start&#39;])){
                $range[&#39;start&#39;] = 0;
            }
            if(empty($range[&#39;end&#39;])){
                $range[&#39;end&#39;] = $file_size;
            }
            return $range;
        }
        return null;
    }
} // class end
?>

Demo

<?php
require(&#39;FileDownload.class.php&#39;);
$file = &#39;book.zip&#39;;
$name = time().&#39;.zip&#39;;
$obj = new FileDownload();
$flag = $obj->download($file, $name);
//$flag = $obj->download($file, $name, true); // 断点续传
if(!$flag){
    echo 'file not exists';
}
?>

Breakpoint-Resume-Testmethode:
Verwenden Sie das Linux wget Befehl zum Testen des Downloads, wget -c -O file http://xxx
1 Deaktivieren Sie zuerst die Wiederaufnahme des Haltepunkts
$flag = $obj->download($file, $name);

fdipzone@ubuntu:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
--2013-06-30 16:52:44--  http://demo.fdipzone.com/demo.php
正在解析主机 demo.fdipzone.com... 127.0.0.1
正在连接 demo.fdipzone.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
fdipzone@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.fdipzone.com/demo.php
--2013-06-30 16:52:57--  http://demo.fdipzone.com/demo.php
正在解析主机 demo.fdipzone.com... 127.0.0.1
正在连接 demo.fdipzone.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. Haltepunkt-Wiederaufnahme aktivieren
$flag = $obj->download($file, $name, true );

fdipzone@ubuntu:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
--2013-06-30 16:53:19--  http://demo.fdipzone.com/demo.php
正在解析主机 demo.fdipzone.com... 127.0.0.1
正在连接 demo.fdipzone.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
fdipzone@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.fdipzone.com/demo.php
--2013-06-30 16:53:31--  http://demo.fdipzone.com/demo.php
正在解析主机 demo.fdipzone.com... 127.0.0.1
正在连接 demo.fdipzone.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])
可以看到会从断点的位置(%20)开始下载。

In diesem Artikel wird der relevante Inhalt der Datei-Download-Klasse von PHP erläutert, die die Übertragung von Breakpoint-Lebensläufen unterstützt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So filtern Sie HTML-Tag-Attributklassen über PHP

So verwenden Sie PHP, um Ersetzen Sie vertrauliche Zeichen. Zeichenfolgenbezogene Vorgänge

Über PHP, das Ordner und Dateiklassen durchläuft und Klassen verarbeitet

Das obige ist der detaillierte Inhalt vonErläutern Sie den zugehörigen Inhalt der PHP-Datei-Download-Klasse, die die Übertragung von Breakpoint-Lebensläufen unterstützt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn