2009-12-12 10 views
12

सबसे पहले, मुझे पहले पूछे जाने वाले प्रश्न के बारे में पता है।PHP रिमोट समर्थन स्ट्रीमिंग समर्थन

विषय काफी सवाल बताते हैं, लेकिन अभी भी,

फ़ाइल किसी अन्य सर्वर पर होस्ट, उपयोगकर्ता, मेरी स्क्रिप्ट के माध्यम से फ़ाइल डाउनलोड करेगा है उसे ही स्ट्रीम ...

लेकिन समस्या यह उपयोगकर्ता के एक बार रोका गया इसे फिर से शुरू नहीं कर सकता ... कोई समाधान?

उत्तर

1

यदि आप फ़ाइल की सेवा के लिए PHP का उपयोग कर रहे हैं, तो आपको अपने सभी पुन: प्रारंभिक तर्क को लागू करना होगा।

आपको Accept-Ranges और respond appropriately से Ranges पर भेजना होगा।

यह काम का एक हिस्सा है। mod_proxy का उपयोग करना आसान हो सकता है।

1

इसका उद्देश्य क्या है? केवल यूआरएल छुपाएं या सिर्फ सदस्यों को डाउनलोड करने की अनुमति दें?

जिस तरह से आप यह वर्णित है, यह थोड़ा मुश्किल है ...

  1. दूरस्थ सर्वर अपनी स्क्रिप्ट से डाउनलोड करेगा शुरू करने डाउनलोड समर्थन करना चाहिए।
  2. आपकी PHP स्क्रिप्ट को 'स्वीकार्य-रेंज' शीर्षलेख & को दूरस्थ सर्वर से पास करना चाहिए (सॉकेट का उपयोग करना मेरा सबसे अच्छा विकल्प है) इसलिए आपकी स्क्रिप्ट वास्तव में प्रॉक्सी के रूप में कार्य कर रही है।
17

आप Accept-Ranges और Content-Range यहाँ का उपयोग कर अपने स्वयं के डाउनलोड स्क्रिप्ट को लागू करने की कोशिश कर सकते अवधारणा का एक प्रोफेसर है:

set_time_limit(0); 
$download = new ResumeDownload("word.dir.txt", 50000); //delay about in microsecs 
$download->process(); 

इंटरनेट डाउनलोड प्रबंधक

प्रारंभ

Start का उपयोग करना

रोका गया

Paused

रुकी हुई स्थिति

Paused State

फिर से शुरू

Resume

समाप्त

enter image description here

कक्षा प्रयुक्त

class ResumeDownload { 
    private $file; 
    private $name; 
    private $boundary; 
    private $delay = 0; 
    private $size = 0; 

    function __construct($file, $delay = 0) { 
     if (! is_file($file)) { 
      header("HTTP/1.1 400 Invalid Request"); 
      die("<h3>File Not Found</h3>"); 
     } 

     $this->size = filesize($file); 
     $this->file = fopen($file, "r"); 
     $this->boundary = md5($file); 
     $this->delay = $delay; 
     $this->name = basename($file); 
    } 

    public function process() { 
     $ranges = NULL; 
     $t = 0; 
     if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_SERVER['HTTP_RANGE']) && $range = stristr(trim($_SERVER['HTTP_RANGE']), 'bytes=')) { 
      $range = substr($range, 6); 
      $ranges = explode(',', $range); 
      $t = count($ranges); 
     } 

     header("Accept-Ranges: bytes"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Transfer-Encoding: binary"); 
     header(sprintf('Content-Disposition: attachment; filename="%s"', $this->name)); 

     if ($t > 0) { 
      header("HTTP/1.1 206 Partial content"); 
      $t === 1 ? $this->pushSingle($range) : $this->pushMulti($ranges); 
     } else { 
      header("Content-Length: " . $this->size); 
      $this->readFile(); 
     } 

     flush(); 
    } 

    private function pushSingle($range) { 
     $start = $end = 0; 
     $this->getRange($range, $start, $end); 
     header("Content-Length: " . ($end - $start + 1)); 
     header(sprintf("Content-Range: bytes %d-%d/%d", $start, $end, $this->size)); 
     fseek($this->file, $start); 
     $this->readBuffer($end - $start + 1); 
     $this->readFile(); 
    } 

    private function pushMulti($ranges) { 
     $length = $start = $end = 0; 
     $output = ""; 

     $tl = "Content-type: application/octet-stream\r\n"; 
     $formatRange = "Content-range: bytes %d-%d/%d\r\n\r\n"; 

     foreach ($ranges as $range) { 
      $this->getRange($range, $start, $end); 
      $length += strlen("\r\n--$this->boundary\r\n"); 
      $length += strlen($tl); 
      $length += strlen(sprintf($formatRange, $start, $end, $this->size)); 
      $length += $end - $start + 1; 
     } 
     $length += strlen("\r\n--$this->boundary--\r\n"); 
     header("Content-Length: $length"); 
     header("Content-Type: multipart/x-byteranges; boundary=$this->boundary"); 
     foreach ($ranges as $range) { 
      $this->getRange($range, $start, $end); 
      echo "\r\n--$this->boundary\r\n"; 
      echo $tl; 
      echo sprintf($formatRange, $start, $end, $this->size); 
      fseek($this->file, $start); 
      $this->readBuffer($end - $start + 1); 
     } 
     echo "\r\n--$this->boundary--\r\n"; 
    } 

    private function getRange($range, &$start, &$end) { 
     list($start, $end) = explode('-', $range); 

     $fileSize = $this->size; 
     if ($start == '') { 
      $tmp = $end; 
      $end = $fileSize - 1; 
      $start = $fileSize - $tmp; 
      if ($start < 0) 
       $start = 0; 
     } else { 
      if ($end == '' || $end > $fileSize - 1) 
       $end = $fileSize - 1; 
     } 

     if ($start > $end) { 
      header("Status: 416 Requested range not satisfiable"); 
      header("Content-Range: */" . $fileSize); 
      exit(); 
     } 

     return array(
       $start, 
       $end 
     ); 
    } 

    private function readFile() { 
     while (! feof($this->file)) { 
      echo fgets($this->file); 
      flush(); 
      usleep($this->delay); 
     } 
    } 

    private function readBuffer($bytes, $size = 1024) { 
     $bytesLeft = $bytes; 
     while ($bytesLeft > 0 && ! feof($this->file)) { 
      $bytesLeft > $size ? $bytesRead = $size : $bytesRead = $bytesLeft; 
      $bytesLeft -= $bytesRead; 
      echo fread($this->file, $bytesRead); 
      flush(); 
      usleep($this->delay); 
     } 
    } 
} 

File Used

+0

धन्यवाद! आपने मेरी बहुत मदद की !!! – HtmHell

+0

आपका स्वागत है :) – Baba

+0

वास्तव में ग्रीटिंग जॉब 1+ –

संबंधित मुद्दे