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

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

narami
nováček
Příspěvky: 5
Registrován: září 11
Pohlaví: Nespecifikováno
Stav:
Offline

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

Příspěvekod narami » 18 zář 2011 19:08

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

Reklama
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: php filesize() - špatná velikost

Příspěvekod CZechBoY » 18 zář 2011 22:18

ž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: září 11
Pohlaví: Nespecifikováno
Stav:
Offline

Re: php filesize() - špatná velikost

Příspěvekod narami » 18 zář 2011 23:25

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: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: php filesize() - špatná velikost

Příspěvekod CZechBoY » 18 zář 2011 23:36

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: září 11
Pohlaví: Nespecifikováno
Stav:
Offline

Re: php filesize() - špatná velikost

Příspěvekod narami » 19 zář 2011 00:20

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: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: php filesize() - špatná velikost

Příspěvekod CZechBoY » 19 zář 2011 08:34

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: září 11
Pohlaví: Nespecifikováno
Stav:
Offline

Re: php filesize() - špatná velikost

Příspěvekod narami » 19 zář 2011 10:19

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: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: php filesize() - špatná velikost

Příspěvekod CZechBoY » 19 zář 2011 17:52

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: září 11
Pohlaví: Nespecifikováno
Stav:
Offline

Re: php filesize() - špatná velikost

Příspěvekod narami » 19 zář 2011 20:21

Díky moc, vypadá to funkčně :smile:


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů