[ ppavlovic @ 30.04.2004. 01:04 ] @
Da li je neko radio nesto slicno:

Recimo, imam php skriptu download.php kojoj se kao parametar prosledjuje ime fajla koji hocu da downloadujem. U skripti se nalazi nesto kao

Code:

$fp = fopen($_REQUEST['file'], 'rb');
while (!feof($fp)){
 fread($str, $fp, 4096);
  echo $str;
}


E, sad... ovakva skripta ne podrzava Resume download, tako da ne mogu da serviram velike fajlove kroz ovu skriptu.

Sta treba da uradim da bih prilagodio skriptu da podrzava resume?


Pozdrav.
[ -zombie- @ 30.04.2004. 03:41 ] @
treba da proučiš HTTP/1.1 rfc (http://www.w3.org/Protocols/rfc2616/rfc2616.html), a naročito Content-Range heder.

zatim treba iz PHPa da otkriješ da li je klijent poslao Range zaglavlje sa getallheaders(), i da shodno tome proslediš odgovarajući deo fajla sa fseek() i fread(), i naravno da sa header() pošalješ response header (valjda opet Content-Range) da bi potvrdio klijentu da si razumeo i poslušao zahtev..
[ Dejan Topalovic @ 30.04.2004. 09:27 ] @
Ovo i mene zanima. Tomice, da li bi mogao da napises jedan primjer ili ces nas pustiti da RTFM-amo?
[ sspasic @ 30.04.2004. 10:31 ] @
Da bi video kako izgledaju ovi hederi možeš da pustiš skidanje nekog fajla hroz HTTP pomoću FlashGet-a u delovima, pošto on prikazuje sadržaj HTTP komunikacije za svaku konekciju i tu se sve vrlo lepo vidi.
[ -zombie- @ 30.04.2004. 11:23 ] @
pa ne znam šta je problem.. koliko meni treba da iščitam rfc i odradim to, toliko bi trebalo i tebi..

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.7
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16

a evo i otprilike koda (na brzinu, napamet, neprovereno):

Code:

$first = 0;
$length = filesize($file);
$headers = getallheaders();
if (isset($headers['Range'])) {
    preg_match('~^(\d+)-(\d+)?~', $headers['Range'], $match);
    $first = $match[1];
    $full = $length;
    if (isset($match[2])) {
        $length = $match[2]-$first+1;
    }
    $last = $length-$first-1;
    header("HTTP/1.1 206 Partial content");
    header("Content-Range: bytes $first-$last/$full");
}
header("Content-Length: $length");
$fp = fopen($file, 'rb');
fseek($fp, $first);
echo fread($fp, $length);
[ ppavlovic @ 30.04.2004. 18:42 ] @
zombie, Pretekao si me!

Ovo je moje resenje (nisam prepisivao od tebe), i provereno je, radi. Doduse, testirao sam ga samo FlashGet-om, ali sto ne bi radio sa ostalim file managerima.
Inace, mnogo je bitan redosled header parametara koji se prosledjuju. Imao sam problema jer mi je Content-Range isao pre Content-Length i tada nije radio resume.

Code:

<?php
    $file = $_REQUEST['file'];
    if (!file_exists("video/$file") && !is_file("video/$file")) {
        header("HTTP/1.1 404 Not Found");
        exit;
    }

    $filesize = filesize("video/$file");
    $headers = getallheaders();
    
    if ($headers['Range']) {
        $range = str_replace("bytes=", "", $headers['Range']);
        list($from, $to) = split('-', $range);
        header("HTTP/1.1 206 Partial Content");
    }

    $fp = fopen("video/$file", 'rb');

    header("Accept-Ranges: bytes");
    header("Content-Length: $filesize");

    if ($from) {
        header("Content-Range: bytes $from-$filesize/$filesize");
        fseek($fp, $from);        
    }

    header("Content-Type: video/x-msvideo");
    header("Content-Disposition: inline; filename=\"$file\"");
    
    while (!feof($fp)) {
        echo fgets($fp, 4096);
        flush();
    }

    fclose($fp);
?>

[ ppavlovic @ 01.05.2004. 15:01 ] @
Jos nesto...

Na pocetku skripte treba staviti
Code:

set_time_limit(86400);
error_reporting(E_NONE);


Desi se da ako je dug fajl i download duze potraje, skripta timeout-uje i nesto od gresaka se pojavi u downloadovanom fajlu.