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?

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top