Besseres Downloadscript gesucht

Guten Abend liebe Forumsgemeinde,
vor einiger Zeit fragte ich hier im Forum nach Hilfe bezüglich der Realisierung eines Dateidownloads in Form von *.zip Dateien. Da die Lösung des damaligen Problems allerdings mit dem IE nicht recht funktionieren wollte bin ich nun nach einer besseren Methode auf die Suche gegangen und wurde auch fündig.

Der Dateidownload wird über eine download.php relisiert, der beim Anklicken einer Datei deren absoluter Pfad bezogen auf die Index.php mit gegeben wird, z.B. so:

http://www.meineSeite.bplaced.net/download.php?file=./Ordner/Unterordner/Datei.pdf

Das Ganze wertet die download.php so aus: $filename = $_GET['file'];

Da es nun leider nicht nur liebe gute Menschen im www gibt, birgt dies natuerlich das Risiko, über URI-Manipulation Dateien herunterzuladen, die dafür gar nicht bestimmt sind.

Ich habe schon hin und her überlegt wie ich von mir aus andere Parameter mitgeben kann, welche ich erst durch das Script wieder in absolute Pfade konvertieren könnte die dann meinetwegen gegen ein array geprüft werden um zu sehen ob der DL okay geht.
Das Problem dabei ist, dass verschiedene Dateien in verschieden vielen Unterordnern liegen können und da stoße ich an meine Grenzen.

bisherige Ideen: glob(); Parameter wie z.B. obersten Ordner, unterordner und dateinamen mitgeben und auswerten. Leider bisher alles ohne Erfolg. =/

Kann mir jemand bei diesem Problem eventuell behilflich sein? Ich wäre sehr dankbar dafür. :slight_smile:

Liebe Grüße, Hase.

Ja, Arrays wären da wohl gut geeignet. Du gibst der Url einfach irgendeine Bezeichnung für den Download mit und in der download.php [dort wird in einem Arra der absolute Pfad notiert] überprüfst du dann, ob das vorhanden ist.
Also zum Beispiel die url: bla.com/download.php?download=diesesbild

<?php $array = array( 'diesesbild' => 'http://bla.com/absoluterpfad/ordner/diesesbild.jpg', 'diesemusik' => 'http://bla.com/absoluterpfad/ordner/diesemusik.jpg' ); if(in_array($_GET['download'],$array)){ header('Location:' . $array[$_GET['download']]); } else { echo 'Du bist böses Mann, verzieh dich!'; } ?>

die datei leitet diese url also zu http://bla.com/absoluterpfad/ordner/diesesbild.jpg weiter…
Alles hne Gewähr, versteht sich…

Vielen Dank für deine Antwort und diesen Denkanstoß, mir kam da gerade eine Idee …
Wie wäre es mit einer Funktion, die den Inhalt eines Ordners ausließt und dessen Inhalt in ein assoziatives array à la Dateiname => Speicherort abspeichert? Dann koennte ich im Downloadscript nach dem, dem Dateinamen zugeordneten, realen Speicherort einer Datei unabhängig vom Verzeichnis suchen lassen und diesen weiterverarbeiten.

Dies ließe sich dann ja relativ einfach gegen ein bestimmtes Muster an Speicherorten prüfen wenn ich diesen aus der download.php mitgegebenen Parametern erst zusammenbauen lasse. Da ich davon ausgehe in Ordnern Oberhalb meines Benutzerordners auf dem Server keine Leserechte zu haben müsste diese Auslese-Funktion ja sowieso mit einem Fehler aussteigen was das Risiko unauthorisierter Downloads minimiert.

Mal sehen, was sich Heute / Morgen noch aus der IDee machen lässt, für Kritik bin ich immer offen. :slight_smile:

LG Hase

Probiers aus. Wenn du dein Script fertig hast, lad es hoch und probier ob du an andere Dateien rankommst. Selbstkontrolle ist das Beste :wink:

Also, mein Fortschritt sieht bisher so aus:

[code]<?php
function ordnerinhalt($ordner) {
$content = array();

	       foreach(scandir($ordner) as $file) {
	              if($file[0] != '.') { // Versteckte Dateien nicht anzeigen
	                       if(is_dir($ordner.'/'.$file)) {
	                                $folderArray[] = $file;
	                        } else {
	                        $fileArray[] = $file;
	                        }
	               }
	        }

	// Erst die Ordner ausgeben
	       if(isset($folderArray)) {
	              foreach($folderArray as $row) {
	                   $content[$row] = ordnerinhalt($ordner.'/'.$row); // rekursiv
		      }
		}
         // ...dann die Dateien ausgeben
	       if(isset($fileArray)) {
	              foreach($fileArray as $row) {
                     	   $content[$row] = $ordner.'/'.$row; //Dateien verlinken
		       }
	        }
        // Rekursion ende
        return $content;
}
			
			$scanning = ordnerinhalt(&ordner);
			print_r($scanning);

?>[/code]

Der Code ist ursprünglich nicht von mir, ich habe ihn nur auf mein Problem hin abgewandelt. Die Quelle ist hier.
Allerdings ist mein Problem noch nicht gelöst, er ordnet zwar allen Dateien die in keinem weiteren Unterordner liegen richtig ihren Seicherort zu, jedoch erzeugt er für Unterordner neue Arrays im array, was das Durchsuchen so wie ich es benötige für mich nicht möglich macht. Hat vielleicht jemand einen Verbesserungsvorschlag?

LG Hase

Sind die Ordner, in denen sich die Datei befinden kann, festgelegt?

(Ungetestet)

Jaein, stell dir das Ganze wie folgt vor:

Ich lese ueber ein script den Inhalt von Ordnern aus, welche sich aus parametern der URI zusammen bauen, z.B. “section=Bilder&category=01”, daraus baut er dann den Pfad zusammen der sich hinter Bilder und Category versteckt und listet die Dateien auf die er findet. roblem dabei ist um sie zum download anzubieten wird beim anklicken ein Link auf eine download.php ausgelöst die als parameter “?file=./absoluter/pfad/zur/datei” enthält was wie oben beschrieben nicht gut ist.

Gleiches würde ich mit dem Script was ich gepostet habe versuchen, nur dass ich dort den Dateinamen als Key und als Value dessen absoluten speicherpfad haben will. Das funktioniert auch nur kann ich in dem sich daraus ergebenden multidimensionalen array nicht richtig nach den keys suchen, oder ich stelle mich zu blöde an.

Ich teste deinen code mal :slight_smile:

EDIT: Der Vorteil den ich mir vom erneuten Auslesen des bezeigten Ordners verspreche ist der dass ich dann einfach als einen weiteren parameter den Dateinamen mitgebe, und diesen gegen ein Array prüfen lasse was in der download.php mit dem obigen Script erstellt wird. Darin sollen sich als keys die dateinamen befinden und als value deren speicherort.

Beispiel: sagen wir die obigen parameter ergeben den absoluten pfad ./Bilder/04/ … dann will ich alle dateien dort drin auslesen was auch klappt, aber, sobald dieser Ordner einen Unterordner hat ergibt sich folgendes

Array ( [Urlaub 08] => Array ( [Mallorca] => Array ( [Bild1.jpg] => ./Bilder/04/Urlaub 08/Mallorca/Bild1.jpg … (weitere Elemente) … [Familiefoto.jpg] => ./Bilder/04/Familienfoto.jpg )

hier ersichtlich die schwierigkeit, das mehrdimensionale array in dem ich nicht nach keys wie zB Bild1.jpg so ohne weiteres suchen kann.
LG