Qué tal:
Tengo problemas con un script para forzar la descarga de archivos. Al descargarlos, si son pesados, los archivos se descargan de manera parcial.
Creí que era el servidor, pero intenté descargarlos sin usar el script y se descargan completitos y sin problemas.
¿Qué ocurre?
Se supone que estoy especificando en las cabeceras el peso del archivo. El tipo de archivo que deseo descargar es MP3, solamente, y pesa más de 10 MB, se descargan sólo 4 o 5 o 6 MB.
Este es mi código:
Código PHP:
$extensiones = array("mp3", "doc", "pdf", "flv");
$f = $_GET["file"];
if(strpos($f,"/")!==false){
die("No es posible navegar por otros directorios");
}
$ftmp = explode(".",$f);
$fExt = strtolower($ftmp[count($ftmp)-1]);
if($f == ""){
die("No se ha especificado ningún archivo para descargar");
} elseif (!in_array($fExt,$extensiones)){
die("<strong>ERROR!</strong> no es posible descargar archivos con la extensión <strong>$fExt</strong>");
} elseif (! file_exists($f)){
die("<strong>ERROR!</strong> no se ha encontrado ningún archivo titulado <strong>$f</strong>");
};
switch( $fExt )
{
case "pdf": $ctype="application/pdf"; break;
case "mp3": $ctype="audio/mpeg3"; 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 "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"$f\"\n");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($f));
readfile("$f");
exit();
Gracias de antemano.