Solución:
Envíe los siguientes encabezados antes de generar el archivo:
header("Content-Disposition: attachment; filename="" . basename($File) . """);
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@grom: Interesante sobre el tipo MIME ‘application / octet-stream’. No era consciente de eso, siempre he usado ‘aplicación / descarga forzada’ 🙂
A continuación se muestra un ejemplo de envío de un pdf.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Swish No encontré el tipo de contenido de aplicación / descarga forzada para hacer nada diferente (probado en IE y Firefox). ¿Hay alguna razón para no devolver el tipo MIME real?
También en el manual de PHP, Hayley Watson publicó:
Si desea forzar la descarga y guardado de un archivo, en lugar de ser renderizado, recuerde que no existe un tipo MIME como “aplicación / descarga forzada”. El tipo correcto para usar en esta situación es “application / octet-stream”, y usar cualquier otra cosa es simplemente confiar en el hecho de que los clientes deben ignorar los tipos MIME no reconocidos y usar “application / octet-stream” en su lugar (referencia: Secciones 4.1.4 y 4.5.1 de RFC 2046).
Además, según IANA, no hay ningún tipo de aplicación / descarga forzada registrada.
Un claro ejemplo.
<?php
header('Content-Type: application/download');
header('Content-Disposition: attachment; filename="example.txt"');
header("Content-Length: " . filesize("example.txt"));
$fp = fopen("example.txt", "r");
fpassthru($fp);
fclose($fp);
?>