yubb.de-Logo
Tutorials
yubb@yubb
yubbService
Inside yubb

Datei zum Download zwingen



Eigentlich ein gutes Feature, dass bestimmte Dateitypen direkt geöffnet werden und man somit unkompliziert an die Daten kommen kann. Nur manchmal möchte man nicht, dass diese Dateien direkt geöffnet werden.

Um diesen entgegen zu wirken, gibt es folgenden Codeschnipsel:
PHP-Datei:
1
2
3
4
5
6
7
8
9
<?PHP
$dateiname
="cs.txt"// Dateiname
$dateiendung=strrchr($dateiname"."); // Ermittelt die Dateiendung
$dateiendung=substr($dateiendung,1); // Nimmt den Punkt vor der Dateiendung weg
header("Content-type: application/$dateiendung"); // Übermittelt den Content-Type
header("Content-Disposition: attachment; filename=".$dateiname.""); // Übermittelt, was heruntergeladen werden soll
header("Content-Length: ".filesize($dateiname)); // Übermittelt die Größe der Datei
readfile($dateiname); // Dateiinhalt übertragen
?>


Dieses Script gibt der Datei einen bestimmten Dateityp, der dafür sorgt, dass die Datei heruntergeladen werden kann. Hier kann man jedoch nicht mit Ordnern arbeiten, sodass diese Datei wirklich im Verzeichnis liegen muss, wo auch die herunterzuladene Datei liegt.

Geschrieben von Phil Marx am 26.04.2005 (17933x gelesen)
weiterempfehlen weiterempfehlen   Druckversion Druckversion   kommentieren kommentieren

warum erst mit Dateiendung?

Ich würde pauschal dann den nehmen: application/octet-stream

das sind ausführbare Dateien, die sollten stets abgefragt werden, ob sie heruntergeladen werden sollen ...
Geschrieben von René
Du solltest zumindest auch am Content-Type sehen können, was du herunterlädst.
Selbstverständlich ist der octet-stream das Nonplusultra, jedoch wollte ich auch im Content-Type darauf hinweisen, WAS geladen wird und nicht nur mit dem Dateinamen.
Geschrieben von Phil Marx
Prima Codeschnipsel!.
Wenn man diesen folgendermaßen variiert, kann die Datei (hier cs.txt) auch in einem anderen Verzeichnis bzw. auf einer anderen Domain liegen, als die PHP-Datei.

PHP-Datei:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?PHP

$dateiname
="ORT/cs.txt"// Dateiname inkl. Verzeichnis bzw. Domain (ORT) 

$dateiname2=strrchr($dateiname"/"); // Ermittelt den Dateinamen
$dateiname2=substr($dateiname2,1); // Nimmt den Slash vor dem Dateiendung weg

$dateiendung=strrchr($dateiname2"."); // Ermittelt die Dateiendung
$dateiendung=substr($dateiendung,1); // Nimmt den Punkt vor der Dateiendung weg
header("Content-type: application/$dateiendung"); // Übermittelt den Content-Type
header("Content-Disposition: attachment; filename=$dateiname2"); // Übermittelt, was heruntergeladen werden soll
header("Content-Length: ".filesize($dateiname)); // Übermittelt die Größe der Datei

readfile($dateiname); // Dateiinhalt übertragen

?>
Geschrieben von Jan
Hallo,

Vielleicht, ist mein Kommentar nicht direkt auf das Downloaden von Dateien bezogen, aber der Codeschnippsel hat mich auf eine Idee gebracht ... :

Kann man mit Hilfe der header()-Syntax auch den Referer setzen(!) ?

thx in advance !

ramin
Geschrieben von ramin
Wow! Danke für diesen Schnippsel. Hab einiges gefunden, aber nix, was so genial (und doch einfach) gelöst ist. Kompliment!
Geschrieben von RoyK.de
Prizipell ein recht guter codeschnipsel, ich hätte(habe) es etwas anders gemacht, ist leichter:
PHP-Datei:
1
2
3
4
5
6
7
8
<?PHP
$dateiname
="cs.txt"// Dateiname
$dateiendung explode("."$dateiname);// Ermittelt die Dateiendung 
header("Content-type: application/$dateiendung[1]"); // Übermittelt den Content-Type
header("Content-Disposition: attachment; filename=".$dateiname.""); // Übermittelt, was heruntergeladen werden soll
header("Content-Length: ".filesize($dateiname)); // Übermittelt die Größe der Datei
readfile($dateiname); // Dateiinhalt übertragen
?>
Geschrieben von RaIdeN
und wie wende ich das jetz genau an?
Geschrieben von Müll0r
schoen schoen. gute idee der code. findet bestimmt mal anwendung bei mir, da man damit auch schoenerweiese dynamsiche dateien erstellen kann... danke!
Geschrieben von Steven
Hallo Phil, Hallo Yubb gemeinde,

Wie soll ich das php script eigentlich anwenden wenn ich irgend wo auf einem Server eine Datei herunterladen möchte giebst hier noch ne anleitung für.

Gruss Martin
Geschrieben von Merlin681
Funktioniert genial !
Vielen Dank, daß etwas unerfahrene Programmierer mit Eurer Hilfe kleine Probleme somit selber lösen können - und dadurch praxisnah etwas mehr verstehen und lernen können.

Irgendwie ist das Internet die bedeutendste Errungenschaft der Moderne - im Guten.

Herzlichen Dank
ch
Geschrieben von ch
Ich hab dazu mal ein kleines Script Geschrieben...

Dadurch wird der MIME Typ automatisch erkannt (Vorrausetzung ist natürlich dass man die MIME erweiterung für PHP installiert hat)

Ich hoffe es bringt jemanden etwas ;) Auf meiner homepage jedenfalls kommt das Script regelmässig zum einsatz.
sample:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?PHP
$filename 
$_GET['name'];

# der pfad sollte natürlich angepasst werden
$testfile "/www/pub/nauti/www/priv/files/$filename";

if(!
file_exists($testfile)){die("No such File. Aborting.<br>");}

if(
$filename == "") {die("No Input. Aborting.<br>");}


else
{
#dasselbe, der pfad sollte wirklich angepasst werden
$dateiname="/www/pub/nauti/www/priv/files/$filename";
$mimetype mime_content_type($dateiname);
$dateiname2=strrchr($dateiname"/");
$dateiname2=substr($dateiname2,1);

$dateiendung=strrchr($dateiname2".");
$dateiendung=substr($dateiendung,1);
@
header("Content-type: $mimetype"); 
@
header("Content-Disposition: attachment; filename=$dateiname2");
@
header("Content-Length: ".filesize($dateiname));
readfile($dateiname); 
}
?>
Geschrieben von sela