ME he leido los dos tutos sobre forzar descargas en flash mediante php y tengo un problema. Las descargas siempre se cortan antes de terminar sobre todo con ficheros grandes (un .zip de 68MB) y tambien con mp3 de unos 4MB. Con los codigos de los tutos que utilizan readfile() se me corta a los 300k mas o menos, con este codigo que saque de php.net he conseguido descargar algun mp3 completo y unos 25mb del .zip pero entero nunca:
Código :
<?php
$f = "../descargas/" . $_GET["archivo"];
$file_extension = strtolower(substr(strrchr($f,"."),1));
switch($file_extension)
{
case "mp3":
header('Content-Description: File Transfer');
header('Content-Type: audio/mp3');
header('Content-Disposition: attachment; filename='.basename($f));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($f));
readfile_chunked($f);
break;
case "zip":
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.basename($f));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($f));
readfile_chunked($f);
break;
case "jpg":
header('Content-Description: File Transfer');
header('Content-Type: image/jpg');
header('Content-Disposition: attachment; filename='.basename($f));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($f));
readfile_chunked($f);
break;
}
function readfile_chunked($filename,$retbytes=true)
{
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;
$handle = fopen($filename, 'rb');
if ($handle === false)
{
return false;
}
while (!feof($handle))
{
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes)
{
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status)
{
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
?>¿Alguien puede ver en que estoy fallando?
