Wie starte ich automatisch einen Download in PHP?
-
09-06-2019 - |
Frage
Welchen Code müssen Sie in PHP hinzufügen, damit der Browser beim Besuch eines Links automatisch eine Datei auf den lokalen Computer herunterlädt?
Ich denke dabei konkret an eine Funktionalität, die der von Download-Sites ähnelt und den Benutzer auffordert, eine Datei auf der Festplatte zu speichern, sobald er auf den Namen der Software klickt?
Lösung
Senden Sie die folgenden Header, bevor Sie die Datei ausgeben:
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@grom:Interessant über den MIME-Typ „application/octet-stream“.Das war mir nicht bewusst, ich habe immer nur „application/force-download“ verwendet :)
Andere Tipps
Hier ist ein Beispiel für das Zurücksenden eines PDFs.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Swish Ich habe den Inhaltstyp „Anwendung/Download erzwingen“ nicht gefunden, der etwas anderes bewirkt (getestet in IE und Firefox).Gibt es einen Grund dafür, den tatsächlichen MIME-Typ nicht zurückzusenden?
Auch im PHP-Handbuch Hayley Watson Gesendet:
Wenn Sie das Herunterladen und Speichern einer Datei anstelle des Renderns erzwingen möchten, denken Sie daran, dass es keinen MIME-Typ wie „application/force-download“ gibt.Der richtige Typ, der in dieser Situation verwendet werden sollte, ist „application/octet-stream“, und die Verwendung eines anderen Typs basiert lediglich auf der Tatsache, dass Clients nicht erkannte MIME-Typen ignorieren und stattdessen „application/octet-stream“ verwenden sollen (Referenz:Abschnitte 4.1.4 und 4.5.1 von RFC 2046).
Auch gem IANA Es gibt keinen registrierten Anwendungs-/Force-Download-Typ.
Ein sauberes Beispiel.
<?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);
?>
Mein Code funktioniert für die Erweiterungen txt, doc, docx, pdf, ppt, pptx, jpg, png, zip und ich denke, es ist besser, die tatsächlichen MIME-Typen explizit zu verwenden.
$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);