PDA

Pogčedajte punu verziju : Download skripta


Bojan Zivanovic
15. 01. 2006., 23:32
Zahtevi su bili:
1) Ogranicenje brzine downloada
2) Rad sa akceleratorima, resume support
download.php, ovde se salju headeri, i poziva funkcija za download
EDIT: Ok, akcelerator radi, al nece resume, tj krene on, predje par kilobajta (5 npr) i stane, kao gotovo..


$mimes = mimeTypes('/home/share/public_html/mimes');
$ext = explode(".",$file);

foreach($ext as $val){
$ekstenzija = $val;
}
$ext = strtolower($ekstenzija);
// use them ($ext is the extension of your file)
if (isset($mimes[$ext])) {
$type = $mimes[$ext];
}
else {
$type = 'application/force-download';
}

$size = filesize("uploads/$id"."-".$file);
$seek_start = 0; // Default values. Will override them latter if the download is partial (resume)
$seek_end = $size;

ini_set("zlib.output_compression", "Off"); // Some browsers (Opera) corrupt the file if this is on
header("Cache-Control: ");// leave blank to avoid IE errors
header("Pragma: ");// leave blank to avoid IE errors
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // neki dan u proslosti
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-Transfer-Encoding: binary");
header("Content-Type: $type");
header("Content-Disposition: attachment; filename=\"$file\"");

// check if http_range is sent by browser (or download manager) . This is used for resuming downloads
if (isset($_SERVER['HTTP_RANGE'])) {
$seek_range = substr($_SERVER['HTTP_RANGE'] , strlen('bytes='));
$range = explode('-',$seek_range);
if ($range[0] > 0) {
$seek_start = intval($range[0]);
}
else {
$seek_start = 0;
}
if ($range[1] > 0) {
$seek_end = intval($range[1]);
}
else {
$seek_end = $size-1;
}

header("Content-Length: " . ($seek_end - $seek_start + 1));
header('Accept-Ranges: bytes');
header("HTTP/1.0 206 Partial Content");
header("status: 206 Partial Content");
header("Content-Range: bytes $seek_start-$seek_end/$size");
}
else {
header("Content-Length: $size");
}

E sad sta je fora, ovaj kod gore ne radi nikako, ako izbacim Content-Length header radi bez resume-a.
Al onda nemam velicinu fajla ispisanu, a ne prihvata ni jedan Length (Ukupan, sabran itd...)
Imam osecaj da je on i kriv sto resume ne radi (posto dobro krene, al prerano stane)
Tako da ja tipujem na headere...

Funkciju sam izbacio posto ona sigurno nije uzrok...

P.S. Ako se pitate zasto su komentari englesko-srpski, to je zato sto nije sav kod moj... Ja komentarisem na engleskom (navika od rada sa strancima),a prethodni programer na srpskom...

Bojan Zivanovic
16. 01. 2006., 02:34
Ajmo programeri, pokazite koliko ste dobri :)
Ja se ubih da nadjem problem, i suzio sam moguce uzroke...

MorenoArdohain
16. 01. 2006., 16:50
Pokazi ti shushtave novcanice :)

Salu na stranu, vecina od nas verovatno nije radila nesto slicno, niti ima vremena da se udubi u resavanje problema. Mozda ces morati da sacekas malo vise, ili da pretrazis net?

zekica
16. 01. 2006., 16:59
Ja sam nešto slično radio ranije, samo sad ne mogu da nađem po arhivama gde je to... U principu nije neka svemirska nauka za napraviti, ali sad trenutno imam puno obaveza, ako stignem, pogledaću ovo...

zextra
16. 01. 2006., 18:13
ako ti je bas hitno... irc://irc.freenode.org/php, navataj nekog tamo da pogleda o cemu se radi :) mozda i nisam u pravu, ali ja prob ovog tipa trpam u kategoriju "egzotika".

ivanhoe
16. 01. 2006., 18:27
ajd napravi neki debug log, pa posalji rezultate, ovako "na suvo" je tesko reci sta mu je...

Proveri headere koje akceleratori salju, mozda ne posalju sve sto skripta ocekuje, ili posalju u nekom cudnom obliku koji onda php zbunii...


Koristi error_log() kao najjednostavniji nacin da ulogujes podatke koje debugujes, recimo uradi obavezno na pocetku skripta:

error_log( print_r( $_SERVER, true) . "\n", 3, 'debug.log');


da vidis koji ti headeri stizu...

Bojan Zivanovic
16. 01. 2006., 19:46
Nema veze, ionako sam planirao da uronim u kod..
Sam po sebi je dosta jednostavan, ali ima 1001 zackoljica, i to me uzasno nervira.. Barem su svi browser-related bugovi vec documentovani..
Hvala svejedno.

nixa
16. 01. 2006., 21:44
e ja sam se pre sa tim drko .. i nikako nisam uspeo da nateram ni jedan download manager da sluša size-lenght ....

ukleto ... :)

zextra
17. 01. 2006., 23:21
ja sam uopste imao problema sa dodatnim headerima koje citaju externi klijenti (npr mail klijent), a resenje je uglavnom bilo relativno jednostavno (ne secam se tacno, ali mislim da je imalo veze sa razmakom izmedju headera i contenta...)