
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.

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

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>

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.
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
.

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.

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);
?>
9882600cookie-checkErzwingen, dass eine Datei mit PHP heruntergeladen wirdyes
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