Šta je novo?

Jednostavna PHP skripta za download

Vlasterx

Čuven
Učlanjen(a)
23.01.2004
Poruke
4,992
Poena
740
Pre više meseci sam napravio jednostavnu PHP skriptu za download. Poenta je da korisnici mogu da preuzmu fajl kad hoće, da se u u bazi pomeri brojač i da se ne vidi odakle se fajl skida. Sve to radi super, ali me zanima sledeće - da li je moguće browseru proslediti i veličinu fajla da bi krajnji korisnik znao koliko mu je još ostalo do kraja download-a?

Evo jedinog važnog dela koda koji koristim:

PHP:
$fajl = $SQL_rezultat['url']."/".$SQL_rezultat['file_name'];

// Slanje fajla
header('Content-Disposition: attachment; filename="'.$SQL_rezultat['file_name'].'"');
header('Content-type: application/octet-stream');
readfile($fajl);

Primer kako radi: http://www.jovanovic.tv/download.php?file=1
 
Kod:
header("Content-Length: "filesize($SQL_rezultat['file_name'])"");

Na primer.

filesize() ti vraca velicinu nekog fajla a slanjem Content-Lenght hedera mozes da kazes browseru koliki je zapravo fajl koji se skida.
 
Poslednja izmena:
Evo jos jedan primer cisto da ti bude jasnije:

Kod:
	$id      = $_GET['id'];
	$query   = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
	$result  = mysql_query($query) or die('Error, query failed');
	list($name, $type, $size, $content) = mysql_fetch_array($result);

	header("Content-Disposition: attachment; filename=$name");
	header("Content-length: $size");
	header("Content-type: $type");
	echo $content;

U ovom primeru duzina fajla je vec bila ubacena u bazu kao i naziv fajla, MIME tip i tako dalje.
 
Poslednja izmena:
Kod:
header("Content-Length: "filesize($SQL_rezultat['file_name'])"");

Na primer.

filesize() ti vraca velicinu nekog fajla a slanjem Content-Lenght hedera mozes da kazes browseru koliki je zapravo fajl koji se skida.


Sjajno! To mi je trebalo, hvala mnogo. Znao sam da je nekako moguće to izvesti, ali nisam znao šta treba da stavim u header. Baš ću da isprobam danas da vidim kako radi.

btw, nisam stavljao veličinu fajla u bazu, a i mislim da je bolje da je izračunava svaki put kada fajl treba da se pošalje, zar ne?


p.s. Još jedno dodatno pitanje - kako je najlakše odrediti mime-type za fajl? Imao sam nekih problema oko toga, pa sam stavio na kraju da je sve application/octet-stream.
 
Poslednja izmena:
PHP:
#
$file = "/www/film.mpg";
$handle = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($handle,$file);

i dobijas "video/mpeg".

PHP:
$file = "/www/bla.mpg";
$handle = finfo_open(FILEINFO_COMPRESS);
$mime_type = finfo_file($handle,$file);

i dobices "MPEG sequence, v1, system multiplex".

Informacije na: http://pecl.php.net/

* FILEINFO_PRESERVE_ATIME - if possible preserve the original access time
* FILEINFO_SYMLINK - follow symlinks
* FILEINFO_DEVICES - look at the contents of blocks or character special devices
* FILEINFO_COMPRESS - decompress compressed files
 
Poslednja izmena:
Hvala, isprobaću večeras sve temeljno. Nešto sam na brzinu probao ono za veličinu fajla i nije radilo kako treba. Sigurno sam negde pogrešio kada sam preleteo preko koda.
 
Super radi onaj deo vezan za veličinu fajla, ali za prepoznavanje tipa fajla ne radi jer nemam na serveru instaliranu potrebnu php biblioteku, mislim da je mime_magic u pitanju.

Hvala još jednom. 😉
 
To recimo moze i ovako:
PHP:
//velicina
$fileSize = $_FILES['myFile']['size'];

//ime fajla
$tmpFile = $_FILES['myFile']['name'];

//tip fajla
$tmpFile = $_FILES['myFile']['type'];

A takodje mozes da napises svoju funkciju za prepoznavanje MIME tipa. Napravi array sa ekstenzijama za svaki od MIME tipova. Tako vrlo lako, radeci explode ukupnog naziva fajla mozes da odvojis ekstenziju i onda da uporedis sa vrednostima u nizovima i da dobijes validni MIME tip.
 
Mogu i tako, ali je to malo opsežan posao. Eventualno bih napravio za najosnovnije ekstenzije tipa ZIP, RAR, ISO, DOC i sl, ali nema šanse da ih sve ubacim koliko ih ima + pitanje je da li korisnik zaista uploaduje fajl koji je deklarisao da uploaduje jer na ovaj način to ne može da se proveri.

PHP:
$tmpFile = $_FILES['myFile']['type'];

Sa ovim sam imao problem ranije kada sam pravio php kod za upload slika iz browsera. Problem je bio u Internet Exploreru koji nije davao nikakvu vrednost za type. Zbog toga sam i odustao od tog izraza pa sam napravio neka zaobilazna rešenja, poput ovog što si ti predložio sa funkcijom za prepoznavanje ekstenzije fajla.
 
Pa dobro, bitno je da smo nasli resenje koje tebi radi i odgovara. Ja sam naveo jos dodatnih primera cisto radi onih koji ce mozda ovo citati u skorijoj buducnosti, kao pokazatelj da postoji nekoliko dobrih nacina da se resi problem.
 
Nazad
Vrh Dno