Domanda

Quale codice devi aggiungere in PHP per fare in modo che il browser scarichi automaticamente un file sul computer locale quando viene visitato un collegamento?

Sto pensando nello specifico a funzionalità simili a quelle dei siti di download che chiedono all'utente di salvare un file su disco una volta cliccato sul nome del software?

È stato utile?

Soluzione

Invia le seguenti intestazioni prima di generare il file:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");

@grom:Interessante il tipo MIME "application/octet-stream".Non ne ero a conoscenza, ho sempre usato semplicemente 'application/force-download' :)

Altri suggerimenti

Ecco un esempio di invio di un pdf.

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

@Swish Non ho riscontrato che il tipo di contenuto di applicazione/download forzato esegua operazioni diverse (testato in IE e Firefox).C'è un motivo per non restituire il tipo MIME effettivo?

Anche nel manuale PHP Hayley Watson pubblicato:

Se desideri forzare il download e il salvataggio di un file, invece che il rendering, ricorda che non esiste un tipo MIME come "application/force-download".Il tipo corretto da utilizzare in questa situazione è "application/octet-stream", e l'utilizzo di qualsiasi altra cosa si basa semplicemente sul fatto che i client dovrebbero ignorare i tipi MIME non riconosciuti e utilizzare invece "application/octet-stream" (riferimento:Sezioni 4.1.4 e 4.5.1 della RFC 2046).

Anche secondo IANA non esiste un tipo di applicazione/download forzato registrato.

Un esempio pulito.

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

il mio codice funziona con le estensioni txt,doc,docx,pdf,ppt,pptx,jpg,png,zip e penso che sia meglio usare esplicitamente i tipi MIME effettivi.

$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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top