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).";" );
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!