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?