Hola a todos, me ha pasado algo muy extraño a lo que no le encuentro sentido.
Tengo una aplicación hecha en PHP y MySQL, las páginas tienen acceso restringido y tiene la opción de insertar
una cookie para recordar al usuario.
Por otro lado tengo un archivo download.php que uso para descargar documentos al pasarle un parámetro en la URL.
Este archivo busca en la base de datos filtrando por ese parámetro y devuelve el nombre del documento.
Luego ejecuto una función para forzar la descarga.
Código PHP:
function downloadFile( $filename ) {
$ext = substr( $filename,-3 );
if( $filename == "" ) {
echo "<html><body>ERROR: Empty file to download. USE download.php?file=[file path]</body></html>";
exit;
} elseif ( !file_exists( $filename ) ) {
echo "<html><body>ERROR: File not found. USE download.php?file=[file path]</body></html>";
exit;
};
switch( $ext ){
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 "jpg": $ctype="image/jpg";
break;
default: $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: ".$ctype);
$user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
if ((is_integer (strpos($user_agent, "msie"))) && (is_integer (strpos($user_agent, "win")))) {
header( "Content-Disposition: filename=".basename($filename).";" );
} else {
header( "Content-Disposition: attachment; filename=".basename($filename).";" );
}
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile($filename);
exit();
}
Cuando me registro normalmente (sin la cookie) todo funciona perfecto. Se pueden descargar los archivos.
Pero al intentar descargar algún documento cuando me he registrado
con la cookie me dice que el
documento no ha sido encontrado.
Estuve revisando la función línea por línea y está bien.
El problema parece estar en las siguientes 2 líneas:
Código PHP:
header("Content-Type: ".$ctype);
header("Content-Disposition: attachment; filename=".basename($filename).";" );
Al comentar estas líneas la función se ejecuta sin errores, encuentra los documentos, pero obviamente los muestra sin formato (como si se abriera un .xls en el bloc de notas).
Me gustaría saber cuál es el problema o incompatibilidad. Si es un problema en la programación o hay que agregar algo en el .htaccess.
Muchas gracias. Saludos!