Ordnerauswahl - warum geht mein Code nicht?
karsten s
- php
Moin, Moin!
ich programmiere gerade an einer php-Anwendung herum und würde gern dem User die Möglichkeit geben einen Ordner auszuwählen. Merkwürdigerweise geht das aber nicht. Obwohl das ein bekanntes Problem ist, habe ich leider keine Erlärung gefunden, warum meins auch nicht geht. Könnt ihr mir sagen, was da nicht geht und wie man es vielleicht doch lösen kann?
<html>
Wählen Sie die gewüschte Bildordner aus:
<input type="file" name="file_path" size="10" id="file_path">
<input type="button" value="Ordner anzeigen" onclick="extract_path()">
</html>
function extract_path() {
curPath = document.getElementById("file_path").value;
curPath = curPath.substr(0,curPath.lastIndexOf("/")+1);
window.location.href = "documentname.php?curordner="+curPath;
}
Wenn ich den Pfad anzeigen lasse ist er okay: /User/username/Ordner1/
Beim Laden der Datei versuche ich dann mit
if ($handle = opendir($_GET['curordner'])) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != ".." && ((eregi(".jpg$",$file)) OR (eregi(".gif$",$file)) OR (eregi(".png$",$file)))) {
$Bilddaten=getimagesize($file);
}
in das Directory zu gehen und die Bilder anzuzeigen, was aber nicht geht:
Warning: getimagesize(DSCI0010.JPG) [function.getimagesize]: failed to open stream: No such file or directory in /Users/username/Sites/Bilder/Bilder 8c/thisdocument.php on line 57
So, in der Hoffnung mich verständlich augedrückt zu haben, warte ich gespannt auf antowrt.
Hallo,
ich programmiere gerade an einer php-Anwendung herum und würde gern dem User die Möglichkeit geben einen Ordner auszuwählen.
um damit was zu tun?
<input type="file" name="file_path" size="10" id="file_path">
Hiermit lässt du den Besucher eine _Datei_ auswählen, kein Vezeichnis.
function extract_path() {
curPath = document.getElementById("file_path").value;
curPath = curPath.substr(0,curPath.lastIndexOf("/")+1);
window.location.href = "documentname.php?curordner="+curPath;
}
Das verstehe ich nich: Du lässt den Besucher eine Datei auf seinem eigenen lokalen System auswählen, reduzierst den Dateinamen per Javascript auf das Verzeichnis, in dem die Datei liegt, und rufst dann eine neue Seite auf, der du als URL-Parameter den ermittelten Verzeichnisnamen mitgibst.
Was soll das aufgerufene Script mit dieser Information anfangen? Es kann ja schließlich nicht auf dieses Verzeichnis zugreifen.
if ($handle = opendir($_GET['curordner']))
Ja, offensichtlich bringst du hier Client- und Serverseite durcheinander. Wie soll ein Script, das serverseitig ausgeführt wird, auf ein Verzeichnis auf dem Client-Rechner zugreifen können?
Warning: getimagesize(DSCI0010.JPG) [function.getimagesize]: failed to open stream: No such file or directory in /Users/username/Sites/Bilder/Bilder 8c/thisdocument.php on line 57
Klar, dein Script versucht ein Verzeichnis gleichen Namens auf dem Server zu finden.
Am besten überlegst du dir nochmal ganz genau, was du eigentlich willst. Kannst gern auch "laut denken", so dass man hier mitlesen kann. ;-)
Ich vermute nämlich, du versuchst ein Ziel zu erreichen, verwendest aber Ansätze, die völlig ungeeignet sind.
So long,
Martin
Okay, ich versuche mal zu beschreiben was ich machen möchte:
Ich habe mehrere Ordner mit mehrere Bildern. Der User soll einen Ordner auswählen können (eigentlich wählt er halt nur ein Bild aus, da das input-field vom Typ "file" mich nichts anderes auswählen lässt.)
Es werden dann alle Bilder dargestellt.
Bislang habe ich einfach die beschriebene Datei in jeden Ordner kopiert und per $handle = opendir(".") auf das aktuelle Verzeichnis zugegriffen. Ich fand es aber unschön, die gleiche Datei mehrfach verwenden zu müssen.
Bilder und Anwendung liegen übrigens alle auf dem "Server", der unter Mac OSX unter /user/username/Sites zu erreichen ist.
Hilft das soweit, dass ihr mir helfen könnt?
Hi,
ich erlaube mir mal, deine Angaben umzusortieren, weil ich den Eindruck habe, dass du das Wichtigste zum Schluss genannt hast.
Bilder und Anwendung liegen übrigens alle auf dem "Server", der unter Mac OSX unter /user/username/Sites zu erreichen ist.
Okay, damit kann dein Webserver (und somit PHP) schonmal auf die Bilder zugreifen, weil sie auf derselben Maschine liegen wie der Server selbst.
Ich habe mehrere Ordner mit mehrere Bildern. Der User soll einen Ordner auswählen können (eigentlich wählt er halt nur ein Bild aus, da das input-field vom Typ "file" mich nichts anderes auswählen lässt.)
Du navigierst also mit dem Auswahlfenster des File-Upload-Buttons durch Verzeichnisse auf dem Server? Wie machst du das denn?
Ich würde in so einem Fall versuchen, die Verzeichnisauswahl auch noch mit PHP zu realisieren. Lass dein Script doch eine Liste mit den Dateien und Verzeichnissen generieren, ähnlich wie es der Apache mit mod_autoindex tun würde. Wenn du diese Liste selbst generierst, kannst du sie ja auch leicht auf die zulässigen Verzeichnisse einschränken.
Dann bräuchtest du nämlich diese etwas seltsame Client/Server-Interaktion gar nicht mehr.
Schönes Wochenende noch,
Martin
Du navigierst also mit dem Auswahlfenster des File-Upload-Buttons durch Verzeichnisse auf dem Server? Wie machst du das denn?
Lokale Maschine a la XAMPP. Server und Client sind identisch, nehme ich an.
Ich würde in so einem Fall versuchen, die Verzeichnisauswahl auch noch mit PHP zu realisieren. Lass dein Script doch eine Liste mit den Dateien und Verzeichnissen generieren, ähnlich wie es der Apache mit mod_autoindex tun würde. Wenn du diese Liste selbst generierst, kannst du sie ja auch leicht auf die zulässigen Verzeichnisse einschränken.
Ist dann auch hinfällig ;)
Lokale Maschine a la XAMPP. Server und Client sind identisch, nehme ich an.
Genau. Unter OSX habe ich standardmäßig einen Server laufen.
Hallo,
ich habe jetzt mal ein bisschen gegoogelt und folgendes Skript gefunden:
http://www.traum-projekt.com/forum/19-traum-dynamik/86425-wichtige-php-tipps.html#11
Jetzt muss ich das nur noch anpassen. Macht es Sinn, wenn ich bei Klick auf . oder .. einfach den aktuellen Pfad per GET an die gleiche Seite wieder übergebe? Also nach Klick auf .., z.B:
gleichesDokument?neuesdir=../
mache, oder soll ich das ohne reload machen?
Moin Karsten,
Könnt ihr mir sagen, was da nicht geht und wie man es vielleicht doch lösen kann?
Beachte die Fehlermeldung.
Warning: getimagesize(DSCI0010.JPG) [function.getimagesize]: failed to open stream: No such file or directory in /Users/username/Sites/Bilder/Bilder 8c/thisdocument.php on line 57
getimagesize versuchte eine Datei "DSCI0010.JPG" zu öffnen.
Da kein Pfad explizit vorgegeben ist wird das aktuelle Arbeitsverzeichnis angenommen.
Daraus resultiert dann "/Users/username/Sites/Bilder/Bilder 8c/DSCI0010.JPG"
als Pfad zur Datei.
if ($handle = opendir($_GET['curordner'])) {
Das ist eine Sicherheitslücke!
Viele Grüße
Stefan
Interessant wäre es, den Wert der Variablen File zu wissen. Ich nehme stark an, dass hier dein Fehler versteckt liegt.
Moin, moin!
Ich habe jetzt versucht über Google ein fertiges Skript zu finden, finde aber nichts. Hat so etwas noch niemand gemacht? Das kann ich gar nicht glauben. Kennt jemand einen Link zu einer solchen per php gemachten Ordnernavigation?
So, ich habe jetzt eine Lösung. Wer will?
<script language="JavaScript" type="text/javascript">
function extract_path(curPath,newPath) {
if (newPath=="..") {
curPath = curPath.substr(0,curPath.length-1); // letztes / weg
newPath = curPath.substr(0,curPath.lastIndexOf("/")+1);
} else {
newPath = curPath+newPath;
}
window.location.href = "sitzplan.php?curordner="+newPath;
}
</script>
<?php
function show_dir($dir) {
$handle = @opendir($dir);
echo "<div id="divnav" style="left:10px">";
echo "<ul id="ulnav">";
while ($file = @readdir ($handle)) {
if(is_dir($dir.$file) && $file!=".") {
if ($file=="..") {
if (ereg ("[a-z]|[0-9]", $dir))
echo "<li class="linav" onclick="extract_path('$dir','..')"> $file </li>";
} else {
echo "<li class="linav" onclick="extract_path('$dir','$file'+'/')"> $file </li>";
}
} elseif ($file!=".") {
echo "<li class="linav"> $file </li>";
}
}
echo "</ul>";
echo "</div>";
@closedir($handle);
}
function build_starting_path() {
$pie=explode("/","$_SERVER[PHP_SELF]"); //Anzahl der Verzeichnisse
$trenner="/"; // Alternativ: ':', '/'
$b=count($pie);
$ta = "";
$resString = ""; // Alternativ: 'Home', 'Start'
for($a=0;$a<$b-3;$a++){
$resString .= "../";
}
for($a=2;$a<$b-1;$a++){
$resString .= $pie[$a]."/";
}
return $resString;
}
if (isset($_GET['curordner']) && $_GET['curordner']!="") {
show_dir($_GET['curordner']);
echo "<input type="hidden" value="$_GET[curordner]" id="curPath" >";
}
else {
$startPath = build_starting_path();
show_dir("$startPath");
echo "<input type="hidden" value="$startPath" id="curPath" >";
}
?>
CSS-DATEI
ul#ulnav{
margin:0;
padding:0;
}
ul#ulnav li{
list-style: none;
display:block;
}
ul#ulnav li:hover{
cursor:pointer;
background-color:#444444;
color:#fefefe;
}
div#divnav {
position:absolute;
left:-2000px;
padding:1em;
margin:0;
background-color:#dfdfdf;
}