2010-02-05 14 views
8

क्या PHP में HTTP_RANGE शीर्षलेख को सही तरीके से पार्स करने का कोई मौजूदा तरीका है? सोचा कि मैं पहिया का पुन: आविष्कार करने से पहले यहां पूछूंगा।PHP में HTTP_RANGE शीर्षलेख पार्सिंग

मैं वर्तमान में

preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches); 

उपयोग कर रहा हूँ हैडर पार्स करने के लिए लेकिन यह है कि अगर वहाँ एक समारोह या पुस्तकालय है कि यह पहले से ही कर सकते हैं मैं सोच रहा हूँ हैडर इतना के सभी संभव मूल्यों को कवर नहीं करता?

अग्रिम धन्यवाद।

+0

मुझे ऐसा करने का कोई तरीका नहीं पता, लेकिन मुझे नियमित अभिव्यक्तियों के साथ एक क्रैक होगा। विनिर्देशन पर एक नज़र डालें http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00 –

उत्तर

10

बल्कि एक 416 भेजने से पहले परीक्षण यह करने के लिए regex का उपयोग करें। फिर पार्स इसे अल्पविराम , और हाइफ़न - पर विस्फोट करके। मैं यह भी देखता हूं कि आपने अपने रेगेक्स में \d+ का उपयोग किया है, लेकिन वास्तव में वे आवश्यक नहीं हैं। जब किसी भी श्रेणी इंडेक्स को छोड़ दिया जाता है, तो इसका मतलब है "पहले बाइट" या "अंतिम बाइट"। आपको इसे अपने रेगेक्स में भी शामिल करना चाहिए। Range header in the HTTP spec को भी देखें कि आपको इसे कैसे संभालना है।

शुरू हो रहे हैं उदाहरण:

if (isset($_SERVER['HTTP_RANGE'])) { 
    if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) { 
     header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
     header('Content-Range: bytes */' . filelength); // Required in 416. 
     exit; 
    } 

    $ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6)); 
    foreach ($ranges as $range) { 
     $parts = explode('-', $range); 
     $start = $parts[0]; // If this is empty, this should be 0. 
     $end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1. 

     if ($start > $end) { 
      header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
      header('Content-Range: bytes */' . filelength); // Required in 416. 
      exit; 
     } 

     // ... 
    } 
} 

संपादित करें:

function getRanges() 
{ 
    return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array(); 
} 

यह भी एक अच्छा विचार this उपयोग करने के लिए है: $ शुरुआत हमेशा $ अंत

+0

धन्यवाद, यह पूरी तरह से काम किया! –

+1

आपका स्वागत है। अस्वीकरण: अनचाहे। यह मेरे जावा सर्वलेट उदाहरण से यहां सिर में कम या अधिक अनुवादित है: http://balusc.blogspot.com/2009/02/fileservlet-supporting-resume-and.html – BalusC

+0

आपने मुझे जावा सर्वलेट साझा करके काम के घंटे बचाए कार्यान्वयन! बहुत बहुत धन्यवाद। – shadit

1

एक टुकड़ा को लागू करने fread() पृष्ठ पर HTTP रेंज समर्थन नहीं है:

http://www.php.net/manual/en/function.fread.php#84115

+1

इससे मदद मिलती है, लेकिन यह छोटी है। केवल एक गाइड के रूप में उपयोग करें। –

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