Pregunta

¿Qué código necesita agregar en PHP para que el navegador descargue automáticamente un archivo en la máquina local cuando se visita un enlace?

Estoy pensando específicamente en una funcionalidad similar a la de los sitios de descarga que solicitan al usuario que guarde un archivo en el disco una vez que hace clic en el nombre del software.

¿Fue útil?

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 'aplicación/flujo de octeto'.No estaba al tanto de eso, siempre he usado 'aplicación/descarga forzada' :)

Otros consejos

A continuación se muestra un ejemplo de cómo enviar un pdf.

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);

@Silbido No encontré el tipo de contenido de aplicación/descarga forzada para hacer algo diferente (probado en IE y Firefox).¿Existe alguna razón para no devolver el tipo MIME real?

También en el manual de PHP Hayley Watson al corriente:

Si desea forzar la descarga y el guardado de un archivo, en lugar de renderizarlo, recuerde que no existe un tipo MIME como "aplicación/descarga forzada".El tipo correcto a usar en esta situación es "application/octet-stream", y usar cualquier otra cosa es simplemente confiar en el hecho de que se supone 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 del RFC 2046).

También según IANA no hay ninguna aplicación registrada/tipo de descarga forzada.

Un ejemplo limpio.

<?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);
?>

mi código funciona para extensiones txt,doc,docx,pdf,ppt,pptx,jpg,png,zip y creo que es mejor usar los tipos MIME reales de forma explícita.

$file_name = "a.txt";

// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);

header('Content-disposition: attachment; filename='.$file_name);

if(strtolower($ext) == "txt")
{
    header('Content-type: text/plain'); // works for txt only
}
else
{
    header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top