PHP HTTP_RANGE başlığını ayrıştırma

3 Cevap php

PHP doğru HTTP_RANGE başlık ayrıştırmak için varolan bir yolu var mı? Ben tekerleği yeniden icat önce burada sormak düşündüm.

Şu anda kullanıyorum

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

Zaten bunu bir fonksiyon veya kitaplık varsa başlık ayrıştırmak için ama bu başlığın tüm olası değerleri kapsamaz yüzden ben merak ediyorum?

Şimdiden teşekkürler.

3 Cevap

Aksine virgül üzerinde patlayan bir 416 . Then just parse göndermeden önce test bunu regex kullanmak , ve tire {[(4) }]. Ben de size regex \d+ kullanılan, ancak bu aslında not gerekli olduğunu görüyoruz. Aralık indeksler ya ihmal edildiğinde, o zaman sadece "ilk bayt" veya "son byte" anlamına gelir. Siz de regex bu kapsamalıdır. Ayrıca bkz Range header in the HTTP spec bunu işlemek zannediyorsunuz nasıl.

Başlama örnek:

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;
        }

        // ...
    }
}

Edit: $ başlangıç ​​her zaman $ bitiş az olmalıdır

Alınan PEAR Package HTTP_Download:

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

Bu this packages bu gibi şeyler için kullanmak da iyi bir fikir!

fread() sayfada HTTP aralığı destek uygulayan bir parçacığı var:

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