Autor Zpráva
Mitch
Profil *
Zdravím,

mám jeden web na PIPNI a oni snížili memory_limit na 6M, takže když odesílám větší soubory pomocí PHP a readfile tak to pošle akorát hlášku Allowed memory exhausted. Tak sem to upravil aby se to posílalo po částech

header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"$file\"");

$fd = fopen("store/".$path.$file,'rb');
if ($fd)
{
while(!feof($fd)) {print fread($fd, 4096);}
fclose($fd);
}

což všude funguje ale ne na jejich serveru. IE napíše stránku nelze zobrazit a FF s Operou neukážou vůbec nic - jako by server nic neposlal. Tak jsem jim napsal a oni mi odpověděli cituji: "musite si jeste vypnout buffering pro PHP a data rovnou fyzicky odeslat."

A i když jsem prolez net tak jsem nepochopil co přesně mám udělat. Nemá někdo řešení? Díky

Mitch
DJ Miky
Profil
Podle toho, co napsali, zřejmě máš nastavený output buffering v PHP. Pokud ano, tak dej nakonec:
ob_end_flush();
Mitch
Profil *
$fd = fopen("store/".$path.$file,'rb');
if ($fd)
{
while(!feof($fd)) {print fread($fd, 4096);}
fclose($fd);
ob_end_flush();
}

Bohužel to samé, zapoměl jsem poznamenat že ta chyba se projeví u velkého souboru -14,2 MB. Další největší co tam mám je 8MB a s tím problémy nejsou.
24k
Profil *
S tím jsem taky bojoval. U velkych souboru to probehne memory exhausted ;/. Tak to zabal do zipu a posilej to klasicky pres header location. (tedy u tech nad 8 MB)
Mitch
Profil *
Memory_limit sem si nechal zvednout na 32M tak jsem zase začal používat readfile ale to by bylo moc jednoduché kdyby to fungovalo jako dřív. Prostě to udělá u toho 14MB souboru to samé jako u načítání po částech, to nechálpu...
Sunny
Profil *
Problém je v tom, že i když vypisuješ data postupně tak se shromažďují v output bufferu... viz output_buffering na php.net. Zkus tohle:

while (@ob_end_flush());
ob_implicit_flush ( true );
$fd = fopen( $file , 'rb' );
if( $fd ) {
while( !feof( $fd ) ) {
print fread( $fd, 4096 );
ob_flush();
flush();
}
fclose( $fd );
}

Je to sice až příliž překombinovaný, ale tvůj ůčel to splní!
Mitch
Profil *
2Sunny: Díky, po menší úpravě už to funguje.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0