Erzwingen, dass eine Datei mit PHP heruntergeladen wird

Lesezeit: 5 Minuten

Erzwingen dass eine Datei mit PHP heruntergeladen wird
Elitmiar

Ich habe eine CSV-Datei auf meinem Server. Wenn ein Benutzer auf einen Link klickt, sollte er heruntergeladen werden, aber stattdessen öffnet er sich in meinem Browserfenster.

Mein Code sieht wie folgt aus

<a href="https://stackoverflow.com/questions/1465573/files/csv/example/example.csv">
    Click here to download an example of the "CSV" file
</a>

Es ist ein normaler Webserver, auf dem ich meine gesamte Entwicklungsarbeit habe.

Ich habe so etwas versucht:

<a href="https://stackoverflow.com/questions/1465573/files/csv/example/csv.php">
    Click here to download an example of the "CSV" file
</a>

Nun der Inhalt meiner csv.php Datei:

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

Jetzt ist mein Problem, dass es heruntergeladen wird, aber nicht meine CSV-Datei. Es erstellt eine neue Datei.

  • Und wie bezieht sich das alles auf PHP?

    – Pavillon

    23. September 2009 um 12:14 Uhr

  • Sie haben vergessen, den Inhalt der Datei auszugeben.

    – Gumbo

    23. September 2009 um 12:42 Uhr

  • habe meine Antwort unten mit einer Lösung für Ihr neues Problem aktualisiert

    – robjmills

    23. September 2009 um 12:43 Uhr

  • geht das auch ohne php?

    Benutzer2935354

    24. April 2014 um 9:46 Uhr


  • Eine weitere gute Antwort finden Sie hier: stackoverflow.com/questions/10934022/…

    – Vaidas

    13. Juni 2014 um 14:56 Uhr

Erzwingen dass eine Datei mit PHP heruntergeladen wird
robjmills

.htaccess-Lösung

Um alle CSV-Dateien auf Ihrem Server per Brute-Force herunterzuladen, fügen Sie Ihre .htaccess-Datei hinzu:

AddType application/octet-stream csv

PHP-Lösung

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile("/path/to/yourfile.csv");

  • Warum ändern Sie nicht einfach die Content-Type-Zeile in Content-Type: application/octet-stream ? Es scheint ein bisschen überflüssig, dies in einer .htaccess-Datei zu tun, wenn Sie es sowieso überschreiben.

    – Machtherr

    22. Oktober 2009 um 21:07 Uhr

  • Das war die anfängliche Antwort auf die Frage, die Frage änderte sich dann, also war der zweite Teil die Antwort darauf.

    – robjmills

    28. Oktober 2009 um 8:34 Uhr

  • Dies funktioniert nicht in allen Browsern mit allen Dateitypen. Zum Beispiel funktioniert es nicht auf der neuesten (August 2013) Version von Chrome mit PDF-Dateien und vielleicht auch CSV-Dateien. In meiner Antwort erfahren Sie, wie Sie dies zuverlässiger zum Laufen bringen können.

    – Chris Harrison

    5. August 2013 um 14:09 Uhr

  • Gute Antwort! Ich würde vorschlagen zu wechseln 'Content-Type: application/csv' zu 'Content-Type: application/octet-stream' wie von @Powerlord vorgeschlagen. Es wird eine abgerundetere Antwort sein und anderen helfen, die nicht nur daran interessiert sind, ihre CSVs herunterzuladen. Nur ein Vorschlag! Danke!

    – Govind Rai

    25. September 2016 um 6:39 Uhr

  • Können Sie mir bitte sagen, wie, wenn es eine zip Datei??

    – Prifulnath

    23. Februar 2017 um 8:54 Uhr


1646924047 0 Erzwingen dass eine Datei mit PHP heruntergeladen wird
AtanuCSE

Oder Sie können dies mit HTML5 tun. Einfach mit

<a href="https://stackoverflow.com/questions/1465573/example.csv" download>download not open it</a>

  • Leider wird dies in IE oder Safari nicht unterstützt: caniuse.com/#feat=herunterladen

    – Sam

    15. Januar 2015 um 16:08 Uhr

  • Das Beste am Hinzufügen herunterladen Attribut ist, dass es das Herunterladen jeder Art von Datei erzwingt.

    – Faizan Noor

    4. Februar 2017 um 18:53 Uhr


  • Es wird endlich in Safari unterstützt!

    – Chuck Le Butt

    3. April 2017 um 10:13 Uhr

  • Ich liebe das. Hat mir eine weitere Nacht erspart, in der ich versucht habe, herauszufinden, wie ich mit diesen verdammten PHP-Download-Headern arbeiten soll.

    – Wenzel

    30. April 2019 um 19:48 Uhr


1646924047 120 Erzwingen dass eine Datei mit PHP heruntergeladen wird
Michael Borgwart

Dies kann nicht zuverlässig durchgeführt werden, da der Browser entscheiden muss, was mit einer URL geschehen soll, die er abrufen soll.

Du kannst empfehlen an den Browser, dass er sofort anbieten soll, “auf der Festplatte zu speichern”, indem er einen Content-Disposition-Header sendet:

header("Content-disposition: attachment");

Ich bin mir nicht sicher, wie gut dies von verschiedenen Browsern unterstützt wird. Die Alternative besteht darin, einen Anwendungs-/Oktett-Stream vom Inhaltstyp zu senden, aber das ist ein Hack (Sie sagen dem Browser im Grunde “Ich sage Ihnen nicht, um welche Art von Datei es sich handelt” und je nachdem, ob die meisten Browser bieten dann einen Download-Dialog an) und verursacht angeblich Probleme mit dem Internet Explorer.

Lesen Sie mehr dazu im Häufig gestellte Fragen zur Webdokumenterstellung.

Bearbeiten Sie haben bereits auf eine PHP-Datei umgestellt, um die Daten zu liefern – was notwendig ist, um den Content-Disposition-Header zu setzen (es sei denn, es gibt einige obskure Apache-Einstellungen, die dies ebenfalls können). Jetzt muss diese PHP-Datei nur noch den Inhalt der CSV-Datei lesen und drucken – die filename=example.csv im Header schlägt dem Client-Browser nur vor, welchen Namen er für die Datei verwenden soll, er ruft die Daten nicht tatsächlich aus der Datei auf dem Server ab.

  • Die Verwendung von “Content-Disposition: Attachment” hat bei uns in allen FF-Versionen, IE6 und IE7, durchgehend funktioniert.

    – Steve Claridge

    23. September 2009 um 12:31 Uhr

  • Normalerweise werden Sie nur dann auf Probleme mit der Inhaltsdisposition stoßen, wenn Sie eine Standardaktion für heruntergeladene Dateien eines für Ihren Browser festgelegten Typs haben, andernfalls folgen Browser normalerweise der Empfehlung (für modernere Versionen ymmv mit alten/veralteten Browserversionen). .

    – David Scherer

    21. November 2018 um 17:28 Uhr

Hier ist eine browsersicherere Lösung:

    $fp = @fopen($yourfile, 'rb');

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
    header('Content-Type: "application/octet-stream"');
    header('Content-Disposition: attachment; filename="yourname.file"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header("Content-Transfer-Encoding: binary");
    header('Pragma: public');
    header("Content-Length: ".filesize($yourfile));
}
else
{
    header('Content-Type: "application/octet-stream"');
    header('Content-Disposition: attachment; filename="yourname.file"');
    header("Content-Transfer-Encoding: binary");
    header('Expires: 0');
    header('Pragma: no-cache');
    header("Content-Length: ".filesize($yourfile));
}

fpassthru($fp);
fclose($fp);

Konfigurieren Sie Ihren Server so, dass er die Datei mit dem Medientyp sendet application/octet-stream.

1646924048 334 Erzwingen dass eine Datei mit PHP heruntergeladen wird
Peter Mortensen

Das bedeutet, dass Ihr Browser diesen Dateityp verarbeiten kann.

Wenn Sie es nicht mögen, wäre die einfachste Methode, ZIP-Dateien anzubieten. Jeder kann mit ZIP-Dateien umgehen und sie können standardmäßig heruntergeladen werden.

1646924048 334 Erzwingen dass eine Datei mit PHP heruntergeladen wird
Peter Mortensen

Schöne saubere Lösung:

<?php
    header('Content-Type: application/download');
    header('Content-Disposition: attachment; filename="https://stackoverflow.com/questions/1465573/example.csv"');
    header("Content-Length: " . filesize("https://stackoverflow.com/questions/1465573/example.csv"));

    $fp = fopen("https://stackoverflow.com/questions/1465573/example.csv", "r");
    fpassthru($fp);
    fclose($fp);
?>

  • Was macht es schön und sauber?

    – Peter Mortensen

    28. März 2018 um 20:14 Uhr

  • Ich würde einfach readfile() aus den Dokumenten verwenden If you just want to dump the contents of a file to the output buffer, without first modifying it or seeking to a particular offset, you may want to use the readfile(), which saves you the fopen() call.

    – David Scherer

    21. November 2018 um 17:31 Uhr


988260cookie-checkErzwingen, dass eine Datei mit PHP heruntergeladen wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy