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 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+, 8+, 10+, 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.

Temas relacionados