php filesize() - špatná velikost

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Zamčeno
narami
nováček
Příspěvky: 5
Registrován: 18 zář 2011 19:00

php filesize() - špatná velikost

Příspěvek 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
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: php filesize() - špatná velikost

Příspěvek od CZechBoY »

že by to bylo tim, že includuješ ještě nějaký soubory k tomu?
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
narami
nováček
Příspěvky: 5
Registrován: 18 zář 2011 19:00

Re: php filesize() - špatná velikost

Příspěvek 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;
 }
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: php filesize() - špatná velikost

Příspěvek 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);
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
narami
nováček
Příspěvky: 5
Registrován: 18 zář 2011 19:00

Re: php filesize() - špatná velikost

Příspěvek 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ý.
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: php filesize() - špatná velikost

Příspěvek od CZechBoY »

použil jsem google, klikl na 2. odkaz a tam to borec vyřešil přes buffer, zkus to taky
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
narami
nováček
Příspěvky: 5
Registrován: 18 zář 2011 19:00

Re: php filesize() - špatná velikost

Příspěvek 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
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: php filesize() - špatná velikost

Příspěvek od CZechBoY »

PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
narami
nováček
Příspěvky: 5
Registrován: 18 zář 2011 19:00

Re: php filesize() - špatná velikost

Příspěvek od narami »

Díky moc, vypadá to funkčně :smile:
Zamčeno
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Velikost souboru a složek na disku
    od L.L » » v Vše ostatní (sw)
    5 Odpovědi
    5987 Zobrazení
    Poslední příspěvek od L.L

Zpět na „Programování a tvorba webu“