Hallo!
Hab ein Problem und auch schon ewig lang rumgesucht, das Problem ist nur, man weiß nichtmal so recht, wonach man eigentlich suchen soll
Und zwar geht's um folgendes:
Stellt euch vor, ihr loggt euch auf einer Download-Seite ein. Nun habt ihr das Recht, bestimmte Dateien runterzuladen, diese werden untereinander in Form von Textlinks (ohne URL) aufgelistet.
Nun kann also nur ein eingeloggter User an die Dateien ran. Blöd wäre aber, wenn er sich ganz einfach die URL der Datei kopiert und weitergibt, dann hat die ganze Einloggerei ja keinen Sinn mehr, da direkt auf die Datei zugegriffen werden kann. Und das will ich verhindern.
Meine Idee war zunächst, die Datei einfach in ein mit .htaccess geschützes Verzeichnis zu tun. Somit kann von außen nicht zugegriffen werden. Kann es aber das PHP-Skript? Und wie würde ich es dann anstellen, daß es funktioniert?
Wenn ich den Link direkt angeben würde, würde es ja wieder Probleme geben, da vom User die .htaccess-Daten abgefragt werden. Wenn ich es über ein PHP-Skript mache, habe ich gehört, kann es Probleme geben, wenn die Datei zu groß ist.
Hat jemand eine Idee, wie man das ganze realisieren kann, so daß es wirklich funktioniert?
Schöne Grüße und schonmal vielen Dank
ZeHa
Ankündigung
Einklappen
Keine Ankündigung bisher.
URL bei Dateidownload unsichtbar machen
Einklappen
Neue Werbung 2019
Einklappen
X
-
URL bei Dateidownload unsichtbar machen
Stichworte: -
-
Hab nun endlich 'ne Lösung gefunden im Netz... damit hier alle was davon haben, hier die Funktion (die man statt readfile() benutzt):
PHP-Code:<?php
function readfile_chunked($filename,$retbytes=true) {
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;
// $handle = fopen($filename, 'rb');
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
echo $buffer;
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
?>
-
Okay, vergeßt mein letztes Problem, es hat nun funktioniert.
ABER der Download bricht tatsächlich nach 2 Minuten ab, und das darf nicht sein. Hat jemand eine Idee, wie man das hinkriegen kann? Kann man die Datei irgendwie in einzelne Pakete aufteilen, wovon der User aber nix mitkriegt?
Weil sonst klappt das ja nur bei kleinen Dateien oder bei schnellen Verbindungen...
Einen Kommentar schreiben:
-
LOL was wird denn das?! Wenn ich die Anführungszeichen durch Hochkommas ersetze, funktioniert es komischerweise!
Einen Kommentar schreiben:
-
Argh, ich verzweifel hier gerade
Hab versucht, das Beispiel mal zu testen, aber ich krieg die ganze Zeit einen Parse Error, und zwar an der Stelle, wo das Array definiert wird!
PHP-Code:$files = array(
"1" => "test.htm",
"2" => "text.txt",
"3" => "doc.pdf",
"4" => "bild3.jpg",
);
Einen Kommentar schreiben:
-
Ja genau - so denke ich auch! Aber trotzdem bleibt die Frage: wie verhindere ich den "time out" bei einer zu großen Datei?
Einen Kommentar schreiben:
-
Und genau das hab ich gemeint, das eben nur über ein verarbeitendes Script Zugriff auf die Datei gewährt wird, damit ist nämlich sicher gestellt, dass eben nur im Umfeld der Anwendung ein Zugriff geschieht und dass unregistrierte Benutzer, oder Serverexterne Quellen (z.B. Google) nicht darauf zugreifen können.
Einen Kommentar schreiben:
-
Das war auch meine erste Überlegung. Nur hab ich dann nicht wieder das gleiche Problem? Wenn die Datei in einem geschützten Verzeichnis liegt, kommt von außen keiner drauf. Die PHP-Datei schon, aber die muß dann ja wieder eine Funktion beinhalten, die dem User die Datei dann anbieten kann. Und hier gibt's doch dann wieder das "time out"-Problem, oder?
Einen Kommentar schreiben:
-
Das ist höchst wahrscheinlich eine Einstellung in der php.ini in welcher die maximale Dateigröße für zu bearbeitende, bzw. zu cachende (Arbeitsspeicher) Dateien angibt. Da wirst du wahrscheinlich nicht viel drehen können. Ansonsten (hab mir das Beispiel noch nicht angeschaut) könntest du über die .htacces den direkten Zugriff auf Dateien verbieten und somit nur noch verarbeitenden Skripten zur Verfügung stellen.
Beispiel:
Code:DirectoryIndex index.php <FilesMatch "\.jpg$"> Order allow,deny deny from all </FilesMatch> <FilesMatch "index.php$"> Order allow,deny allow from all </FilesMatch> <FilesMatch "\.(inc|php)$"> Order allow,deny deny from all </FilesMatch>
Einen Kommentar schreiben:
-
Okay, erstmal vielen Dank, das Beispiel sieht wirklich schon ganz gut aus!
Nur noch eine Frage, bevor ich das jetzt alles einbaue: ein Kumpel hat mir erzählt, daß es bei readfile() vorkommen kann, daß der Download abbricht, wenn die Datei zu groß ist. Stimmt das so? Wenn ja, wie umgeh ich das?
Einen Kommentar schreiben:
Einen Kommentar schreiben: