Stránka 1 z 1

php filesize() - špatná velikost  Vyřešeno

Napsal: 18 zář 2011 19:08
od narami
Na webovém formuláři na stahování souborů mám:

Kód: Vybrat vše

$velikost = filesize($soubor);
header("Content-Length: ".$velikost);

Funkce filesize úspěšně vrátí hodnotu, ale při použití v header zjišťuji, že velikost je menší než skutečná, řádově o 5%. Soubor se přestane stahovat dříve, než je plně přenesený a není ho tedy možné otevřít. Pokud v hlavičce nepošlu velikost, stáhne se sice soubor celý, ale není vidět zbývající čas a probíhá-li stahování přes IE, nelze následně ani otevřít.
Zkopíroval jsem několikrát podobný kód, který je na fórech uváděn jako funkční, ale na stejnou chybu narazím vždy. Nevíte, co s tím?
Díky

Re: php filesize() - špatná velikost

Napsal: 18 zář 2011 22:18
od CZechBoY
že by to bylo tim, že includuješ ještě nějaký soubory k tomu?

Re: php filesize() - špatná velikost

Napsal: 18 zář 2011 23:25
od narami
Ne, posílám jen ten jeden soubor.
Zde je celá funkce, kterou jsem od někuď zkopíroval a poupravil:

Kód: Vybrat vše

function dl_file($file){

     //First, see if the file exists
     if (!is_file($file)) { die("<b>404 File not found!</b>"); }

     //Gather relevent info about file
     $len = filesize($file);
     $filename = basename($file);
     $file_extension = strtolower(substr(strrchr($filename,"."),1));

     //This will set the Content-Type to the appropriate setting for the file
     switch( $file_extension ) {
           case "pdf": $ctype="application/pdf"; break;
       case "exe": $ctype="application/octet-stream"; break;
       case "zip": $ctype="application/zip"; break;
       case "doc": $ctype="application/msword"; break;
       case "xls": $ctype="application/vnd.ms-excel"; break;
       case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
       case "gif": $ctype="image/gif"; break;
       case "png": $ctype="image/png"; break;
       case "jpeg":
       case "jpg": $ctype="image/jpg"; break;
       case "mp3": $ctype="audio/mpeg"; break;
       case "wav": $ctype="audio/x-wav"; break;
       case "mpeg":
       case "mpg":
       case "mpe": $ctype="video/mpeg"; break;
       case "mov": $ctype="video/quicktime"; break;
       case "avi": $ctype="video/x-msvideo"; break;

       //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
       case "php":
       case "htm":
       case "html":
       case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

       default: $ctype="application/force-download";
     }

     //Begin writing headers
     header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
     header("Pragma: public");
     header("Expires: 0");

     //header("Cache-Control: public");
     header("Content-Description: File Transfer");
     
     //Use the switch-generated Content-Type
     header("Content-Type: $ctype");

     //Force the download
     $header="Content-Disposition: attachment; filename=".$filename.";";
     header($header );
     header("Content-Transfer-Encoding: binary");
     //header("Content-Length: ".$len); //Nesmi byt jinak jsou soubory poskozene

     @readfile("$file");
     exit;
 }

Re: php filesize() - špatná velikost

Napsal: 18 zář 2011 23:36
od CZechBoY
nevim proč to tak řešíš, poukd potřebuješ stáhnout soubor tak ho stáhneš přes poslání Headerů:
PHP píše:@Header("Content-Description: File Transfer");
@Header("Content-Type: force-download");
@Header("Content-Disposition: attachment; filename=\"$soubor\"");
@Readfile($soubor);

Re: php filesize() - špatná velikost

Napsal: 19 zář 2011 00:20
od narami
Já vím, většina kódu je jen omáčka, která s posláním jako takovým nemá co dělat.
Tvůj kód sice funguje, ale výsledek je stejný jako u mého: Nepošle se velikost souboru. Když pak stahuješ stomegový nebo větší soubor tak ale chceš vědět, kolik času zbývá (a čas prohlížeč dopočítává na základě velikosti). Navíc to takto některým lidem (pravděpodobně IE) nefunguje - zip archiv po stažení nelze otevřít.

Abych problém vyřešil, musím k tvému kódu přidat:

Kód: Vybrat vše

@Header("Content-Length: ".filesize($soubor));

Následně ale získám to, co jsem popisoval výše - filesize vrátí asi o něco menší hodnotu, takže se soubor nedostahuje a je tedy nepoužitelný.

Re: php filesize() - špatná velikost

Napsal: 19 zář 2011 08:34
od CZechBoY
použil jsem google, klikl na 2. odkaz a tam to borec vyřešil přes buffer, zkus to taky

Re: php filesize() - špatná velikost

Napsal: 19 zář 2011 10:19
od narami
Zkoušel jsem samozřejmě googlit docela dost před tím, než jsem se vůbec zeptal. České hledání mi ale vyplivne tuto diskuzi, anglické problémy se soubory většími než 2 GB. Nemohl bys mi prosím onen odkaz poslat?
Díky

Re: php filesize() - špatná velikost

Napsal: 19 zář 2011 17:52
od CZechBoY

Re: php filesize() - špatná velikost

Napsal: 19 zář 2011 20:21
od narami
Díky moc, vypadá to funkčně :smile: