2010-07-15 2 views
7

Die Frage sagt alles .. Wie lassen Sie die Benutzer eine Datei von meiner Website herunterladen und nicht lassen sie sehen, aus welchem ​​Link diese Datei stammt? Ich verstehe, dass es eine Notwendigkeit für etwas wie eine download.php, die als Gateway dienen, aber hinter dieser Phase, ich weiß nicht, was Skript nächste ... Wenn es Sie stört, den gesamten Code zu schreiben, ein paar Funktionen Namen, die ich verwenden sollte, wären wirklich praktisch!Ein PHP-Skript, mit dem Benutzer eine Datei von meiner Website herunterladen können, ohne den eigentlichen Datei-Link auf meiner Website anzuzeigen?

Antwort

10

Suchen Sie nach einer Möglichkeit, die herunterzuladende Datei anzugeben (z. B. eine GET-Variable, die mit der ID einer Zeile in einer Datenbank übereinstimmt, oder etwas in dieser Richtung). Stellen Sie sicher, dass es ein gültiger ist, weil Sie nicht möchten, dass Ihre Benutzer etwas von Ihrer Site herunterladen können. Verwenden Sie dann header mit Content-Disposition, um dem Browser mitzuteilen, dass die Datei heruntergeladen werden soll, und readfile, um sie auszugeben.

Zum Beispiel:

<?php 

$id = intval($_GET['id']); 
$query = mysql_query('SELECT file_path FROM files WHERE id = ' . $id); 
if (($row = mysql_fetch_row($query)) !== false) 
{ 
    header('Content-Disposition: attachment; filename=' . basename($row[0])); 
    readfile($row[0]); 
} 
exit; 

?> 
+0

Ich erinnere mich an eine ähnliche Technik für den Export von E-Mail-Adressen in einer CSV-Datei. Der Content-Type-Header wurde von Safari für Mac ignoriert. – Keyo

+0

Ist dieses Skript htaccess-proof? Ich habe eine htaccess-Regel, um den Zugriff auf echte URL zu verweigern, falls die Methode umgangen wurde. Hat "Deny of All" auch Auswirkungen auf dieses Skript? –

+0

@ CodigosTutoriales, Regeln in .htaccess-Dateien wirken sich nur auf Webanfragen von einem Client aus. Sie tun nichts, um zu verhindern, dass Ihr Servercode Dateien auf dem Server liest. – zneak

1

können Sie die header() Funktion benutzen, die documented here

ist, würde ich am ersten Beispiel nach unten scrollen und auf der Suche vor. Es scheint genau das zu tun, was du willst.

+0

Nur eine Anmerkung für Shedo Chung-Hee Surasi - Das zweite Beispiel zeigt Ihnen auch, wie Sie einen Dateinamen angeben können, der sich vom Namen der ursprünglichen Datei unterscheidet (wie Sie in Ihrer Frage erwähnt). – jerebear

0

readfile sollte das tun, was Sie wollen. Legen Sie die tatsächliche Datei außerhalb des Stammverzeichnisses des Webservers ab, und fordern Sie einige Anmeldeinformationen an, bevor Sie die Datei zurückgeben.

4

Sie können nicht verhindern, dass jemand eine Datei von einer URL herunterlädt, ohne dass dieser die URL kennt. Unter der HTTP-Spezifikation ist dies nicht möglich. Alles, was heruntergeladen wird, hat eine URL.

Sie können jedoch eine Download-URL verwenden, die nur einmal funktioniert oder bestimmte Informationen benötigt, die über die POST-Methode übergeben werden. Sie suchen nach einem Token in den GET- oder POST-Variablen und machen dieses Token ungültig, sobald es einmal verwendet wurde.

Verwandte Themen