Forzar descarga de un archivo vía PHP
Hoy durante mi jornada de trabajo ha surgido un pequeño problema con el tema de forzar una descarga de un archivo X, funcionando a las mil maravillas en todos los navegadores menos con las distintas versiones de Internet Explorer a las que tenemos que dar soporte. Tras un rato investigando por Google y probar infinidad de cabeceras, deshabilitar la compresión … he conseguido un código que por fin ha funcionado.
La verdad es que gracias a nuestro maravilloso IE tenemos que meter todo el contenido del archivo a descargar dentro de una variable y luego mostrarla anteponiendo unas cabeceras; esto lo único que consigue es que la descarga tarde más en iniciarse.
$sDocumento = $_GET["archivo"]);
$buffer = file_get_contents($sDocumento);
header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header ("Content-Type: application/octet-stream");
header ("Content-Length: " . strlen($buffer));
header ("Content-Disposition: attachment; filename=".$_GET['audio'].".mp3");
echo $buffer;
Por si a alguien le interesa, el código que funciona con todos los demás navegadores (Firefox 3+, Chrome 8+, Opera 10+, Safari 5) es bastante más rápido a la hora de lanzar la descarga.
$sDocumento = $_GET["archivo"]);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($sDocumento)).' GMT');
header('Cache-Control: private',false);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".$_GET['archivo'].".mp3");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($sDocumento));
readfile($sDocumento);
Por cierto, para la prueba he utilizado el descargar un archivo MP3 pero se puede utilizar para cualquier otra extensión.