Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] DirectoryListings Part 2 (https://www.delphipraxis.net/55599-%5Bphp%5D-directorylistings-part-2-a.html)

Luckie 23. Okt 2005 23:08


[PHP] DirectoryListings Part 2
 
Liste der Anhänge anzeigen (Anzahl: 1)
Folgendes Problem: Ich habe vor ein kleines WebFTP Script u schreiben. Dabei habe ich mir gedacht, dass oben immer ein DirectoryListing erscheint, so wie hier: http://www.luckie-online.de/Ablage/. OK, soweit kein Problem. Jetzt dachte ich mir, wen ich in ein Verzeichnis wechseln will, dass sich die Datein selber aufruft mit dem Pfad als Parameter: index.php?path=css. Die index.php sieht jetzt so aus:
Code:
<html>
<head>
  <title>LittleWebFTP</title>
  <link rel="stylesheet" type="text/css" href="css/webftp.css">
</head>
<body>
  <h1>LittleWebFTP</h1>
 



  <?php
    $path = getcwd().'/'.$path;
    echo '[b]Contents of[/b] '.$path;
  ?>
  </p>
  [img]images/line.png[/img]
  <table class="dir">
  <colgroup>
    <col width="150" align="left">
    <col width="75" align="right">
    <col width="675" align="left">
    </colgroup>
  <?php
    include 'php/webftp.php';

    echo '<tr>';
    echo '<th class="dir">[url="index.php?SortOrder=time"]Last modified[/url]</th>
      <th class="dir"><a class="parent" href="index.php?SortOrder=size">Size</th>
      <th class="dir">[url="index.php?SortOrder=name"]Name[/url]</th>';
    echo '</tr>';
    echo $path;
    $dirs = ListDirs($path);
    foreach($dirs as $dir)
    {
      echo '<tr>';
      echo '<td class="dir">'.date("Y-m-d H:i", filemtime($dir)).'</td>
        <td class="dir">&lt;DIR&gt;</td>
      <td class="dir">[url="index.php?path='.$dir.'"]['.$dir.'][/url]</td>';
      echo '</tr>';
    }
    ?>
    </table>

    <table class="files">
    <colgroup>
      <col width="150" align="left">
      <col width="75" align="right">
      <col width="675" align="left">
    </colgroup>
    <?php
    if ($SortOrder == '')
    {
      $SortOrder = 'name';
    }
    echo $path;
    $files = ListFiles($path, $SortOrder);
    foreach($files as $file)
    {
      echo '<tr>';
      echo '<td class="files">'.date("Y-m-d H:i", filemtime($file)).'</td>
        <td class="files">'.format_filesize(filesize($file)).'</td>
        <td class="files">[url="'.$file.'"]'.$file.'[/url]</td>';
      echo '</tr>';
    }
  ?>
  </table>
  [img]images/line.png[/img]
  <table class="tblfooter">
    <tr>
    <?php
      echo '<td class="total">'.'Total: '.count($files).' file(s) - '.count($dirs).' directory(s) ~'.format_filesize(directory_size($path)).'</td>'.
        '<td></td>';
    ?>
    </tr>
  </table>
  </p>
</body>
</html>
Und die beiden relevaten Funktionen ListDirs und ListFiles

Code:
//
// Returns the sub-directories of a given directory
//
function ListDirs($dir)
{
  $dirs=Array();
  $handle=opendir($dir);
  $count=0;

  while(false !== ($file = readdir($handle)))
  {
    if (is_dir($file) /*&& ($file != '.')*/)
    {
      $dirs[$count] = $file;
      $count++;
    }
  }
  closedir($handle);
  array_multisort($dirs, SORT_ASC, $dirs);
  return $dirs;


//
//  Returns the files in a given directory
//  Valid values for $SortOrder: name, time, size
//
function ListFiles($dir, $SortOrder)
{
  $files=Array();
  $handle=opendir($dir);
  $count=0;

  while(false !== ($file = readdir($handle)))
  {
    if (is_file($file))
    {
      $files[$count] = $file;
      $Time[$count]=filemtime($files[$count]);
      $Size[$count]=filesize($files[$count]);
      $count++;
    }
  }
  closedir($handle);
  if ($SortOrder == 'name')
  {
    array_multisort($files, SORT_ASC, $files);
  }
  elseif ($SortOrder == 'time')
  {
    array_multisort($Time, SORT_DESC, $files);
  }
  elseif ($SortOrder == 'size')
  {
    array_multisort($Size, SORT_ASC, $files);
  }

  return $files;
}
Das haut aber irgendwie nicht so ganz hin. Wenn ich auf einen Ordner klicke dann gibt mir das
Code:
$path = getcwd().'/'.$path;
    echo '[b]Contents of[/b] '.$path;
folgenden Pfad aus (zum Beispiel): /var/www/l3s11195/html/Ablage/Privat/LittleWebFTP/css aber alles was passiert ist, dass aus dem Listing alle Verzeichnisse bis auf [.] und [..] und Dateien verschwinden. Seit acht Uhr doktere ich da nun schon dran rum und bin kein Stückchen weitergekommen. Wo ist mein Denkfehler? Was mache ich falsch? Oder packe ich es prinzipiell falsch an?

Zum Ausprobieren alles noch mal im Anhang.

Christian S. 24. Okt 2005 00:23

Re: [PHP] DirectoryListings Part 2
 
Hallo!

Passe die Schleife in der Funktion "ListFiles" folgendermaßen an:
Code:
  while(false !== ($file = readdir($handle)))
  {

    if (is_file($dir.'/'.$file))
    {
      $files[$count] = $file;
      $Time[$count]=filemtime($dir.'/'.$file);
      $Size[$count]=filesize($dir.'/'.$file);
      $count++;
    }
  }
Du hattest das Verzeichnis vergessen, womit die Datei natürlich gefunden wurde. Eine entsprechende Anpassung muss auch noch in der index.php gemacht werden (Zeilen 58 und 59):
Code:
      echo '<td class="files">'.date("Y-m-d H:i", filemtime($path.'/'.$file)).'</td>
        <td class="files">'.format_filesize(filesize($path.'/'.$file)).'</td>
Grüße
Christian

Pr0g 24. Okt 2005 00:33

Re: [PHP] DirectoryListings Part 2
 
Gefiel dir meins nicht :mrgreen:

Luckie 24. Okt 2005 01:00

Re: [PHP] DirectoryListings Part 2
 
Hallo Christina, das war's. Irgendwann wird man glaube ich blind, wenn man da zu lange draufguckt. jetzt reagiert6 er nur etwas merkwürdig, wenn man auf die Punkte [.] und [..] klickt, die das aktuelle und das übergeordnete Verzeichnis repräsentieren.

Luckie 24. Okt 2005 02:51

Re: [PHP] DirectoryListings Part 2
 
Zitat:

Zitat von Pr0g
Gefiel dir meins nicht :mrgreen:

Nun ja, es funktioniert nicht. Ich kann zwar Dateien ansehen und in den Bearbeitungs Modus gehen, aber ich kann keine Datei speichern, hoch laden, löschen oder ein Verzeichnis anlegen oder löschen. Weder mit $use_ftp = true oder false.

Code:
<?php

  // Rootverzeichnis ausgehend von dieser Datei. Es ist nicht möglich aus dem
  // Script später in eine höhere Ebene zu wechseln.
  //
  // HINWEIS: Den Pfad ohne abschließendes / angeben
  $root_dir = '../../../';

  // Wenn Sie beim Verschieben von Dateien den Zielordner aus einer Baum-
  // struktur auswählen wollen, so setzen Sie diese Einstellung auf "true".
  // Soll stattdessen nur ein Eingabfeld zur dirketen Angabe eines Pfads
  // angezeigt werden, so setzen Sie die Einstellung auf "false".
  $move_tree = true;
 
  // Wenn beim Öffnen einer Datei (Klick auf Dateiname) oder Anzeigen der
  // Codeansicht statt eines normalen, neuen Fensters ein kleines Popup
  // angezeigt werden soll, dan setzen Sie die Einstellung auf "true", sonst
  // auf "false". Für das Popup muss JavaScript in Ihrem Browser aktiviert
  // sein.
  $open_popup = true;
 
  // Haben Sie die Popup-Einstellung auf "true" gesetzt, also aktiviert, so
  // können Sie hier die Breite (width) und Höhe (height) des Popups setzen.
  $popup_width = '550';
  $popup_height = '600';
 
  // Falls nach dem Anlegen eines Ordners Fehler auftreten, liegt dies meist an
  // einem falsch konfigurierten safe_mode des Servers. Wenn Sie Zugriff auf
  // die php.ini haben, so deaktivieren sie den safe_mode, oder setzen Sie die
  // folgende Zeile auf true: $use_ftp = true;
  $use_ftp = false;

  // Die folgenden FTP Daten müssen nur angegeben werden, wenn Sie den FTP
  // Modus aktiviert haben
  $ftp_hostserver = '';
  $ftp_username = '';
  $ftp_password = '';
  // FTP Pfad zum Rootverzeichnis, welches Sie oben in $root_dir angegeben
  // haben. Bitte mit einem / beginnen und enden. Bspw. /www/upload/
  $ftp_rootdir = '';

Luckie 24. Okt 2005 04:23

Re: [PHP] DirectoryListings Part 2
 
Ich glaube, ich kann das alles begraben. Ich habe gerade ein Uploadscript ausprobiert und diese Fehlermeldung bekommen:
Zitat:

Warning: move_uploaded_file(): SAFE MODE Restriction in effect. The script whose uid is 3922 is not allowed to access / owned by uid 0 in /var/www/l3s11195/html/Ablage/test/upload.php on line 314
Allerdings ist der PHP Upload eigentlich in diesem Paket gestattet. :evil:

Matze 24. Okt 2005 06:00

Re: [PHP] DirectoryListings Part 2
 
Versuche einmal den Server-Pfad $_SERVER['DOCUMENT_ROOT'] zu verwenden. Das war ein Tipp, den ich über Google auf die Schnelle gefunden habe.

Luckie 24. Okt 2005 11:31

Re: [PHP] DirectoryListings Part 2
 
Danke für den Tipp. Aber das habe ich auch schon probiert. Ich habe gestern noch eine Mail an UD Media geschickt, worauf sie geantwortet haben, dass ich die Groß- und Kleinschreibung überprüfen solle. Ich habe drauf geantwortet:

Zitat:

Hallo,
ich weiß, dass das Dateisystem von Linux Systemen Case-Sensitiv ist. Aber
das spielt doch hier keine Rolle:

$filename = getcwd().'/'.'cpath.txt';
$handle = fopen($filename, "w");
fwrite($handle, 'abc');

Sollte so eigentlich stimmen. Nur leider bekomme ich die Fehlermeldung:
"Warning: fopen(/var/www/l3s11195/html/Ablage/Privat/Test/cpath.txt): failed
to open stream: Permission denied"

getcwd() liefert den Pfad so wie er ist und er stimmt auch mit dem Pfad über
ein: http://www.luckie-online.de/Ablage/Privat/Test/

Gebe ich den Pfad so an: /html/Ablage/Privat/Test/cpath.txt oder so
/Ablage/Privat/Test/cpath.txt/cpath.txt bekomme ich die Meldung:
"Warning: fopen(): open_basedir restriction in effect.
File(/html/Ablage/Privat/Test/cpath.txt) is not within the allowed path(s):
(/var/www/l3s11195:/usr/lib/php) in
/var/www/l3s11195/html/Ablage/Privat/Test/index.php on line 24"


Desweiteren habe ich festgestellt, dass ich auch mit touch keine Datei
anlegen kann:
"Warning: touch(): Utime failed: Permission denied in
/var/www/l3s11195/html/Ablage/Privat/Test/index.php on line 23"

Außerdem lautet die fehlermeldung ja "Permission denied", also dass mir die
nötigen Rechte feheln und nicht "Pfad oder Datei nicht gefunden" was der
Fall wäre, wenn der Pfad nicht stimmen würde.

Ich habe damals von Start XL auf Start XXL upgegradet. Kann es eventuell
sein, dass dort vergessen wurde die entsprechenden Features frei zu
schalten?

Chewie 24. Okt 2005 13:52

Re: [PHP] DirectoryListings Part 2
 
Bei dir ist wohl der Safemode akriv, Luckie.
Versuch zum Vergleich mal, eine Datei mit relativem Pfad zu lesen (./this/path) und nicht mit dem absoluten.
Glaub zwar nicht, dass das hilft, aber ein Versuch ists wert.

Luckie 24. Okt 2005 15:05

Re: [PHP] DirectoryListings Part 2
 
Habe ich auch schon probiert. Aber sie schreiben ja eindeutig, dass der PHP Upload möglich wäre, deswegen mü+sste ich auch das Recht haben eine Datei anzulegen. Ich warte mal ab, was die jetzt antworten. Aber ich fände es eine Frechheit mir Webspace zu diesen Konditionen zu verkaufen und dann kann ich ihn doch nicht so nutzen, wie ich will und wie sie es anpreisen. :evil:

Pr0g 24. Okt 2005 20:11

Re: [PHP] DirectoryListings Part 2
 
Hättest dich ja mal bei mir melden können. Würde mich schon interessieren, wenn jemand einen eventuellen Bug gefunden hat.

Zu deinem SAFE Mode-Fehler, hast du es mal mit den FTP Funktionen von PHP Versucht. Habe bei mir extra FTP eingeführt, damit das Script auch mit aktivem SAFE Mode funktionier. Zumindest bei einem User mit diesem Problem war es danach möglich.

Sonst frag doch mal deinen Hoster, ob er den SAFE Mode nicht deaktivieren könnte. Über den Nutzen dieser Erweiterung streiten sich einige immer noch und AFAIK wird er doch in neueren PHP Versionen ganz gestrichen.

Luckie 24. Okt 2005 22:45

Re: [PHP] DirectoryListings Part 2
 
Mail an den Hoster ist ja raus, siehe oben. Antwort steht noch aus. Aber die FTP Lösung, von der ich nicht weiß, wie sie geht, kann es ja auch nicht sein. Ich wollte zum Beispiel eine Logdatei nebenbei führen.

Zitat:

Hättest dich ja mal bei mir melden können. Würde mich schon interessieren, wenn jemand einen eventuellen Bug gefunden hat.
Ich hahbe doch hier im Thread geschrieben, wie es sich hier bei mir verhalten hat, nach dem du mich daraufhingewiesen hast.

Pr0g 24. Okt 2005 23:15

Re: [PHP] DirectoryListings Part 2
 
Zitat:

Zitat von Luckie
Mail an den Hoster ist ja raus, siehe oben. Antwort steht noch aus. Aber die FTP Lösung, von der ich nicht weiß, wie sie geht, kann es ja auch nicht sein. Ich wollte zum Beispiel eine Logdatei nebenbei führen.

Naja, falls dein Hoster das Problem mit dem Safe Mode nicht lösen sollte und es per FTP geht, wäre es ja eine Alternative (FTP Functions).

Zitat:

Zitat von Luckie
Ich hahbe doch hier im Thread geschrieben, wie es sich hier bei mir verhalten hat, nach dem du mich daraufhingewiesen hast.

Ich dachte du hättest das Fehlverhalten schon vor meinem Post gehabt, war nen Missverständnis. Hast du irgendwelche Fehlermeldungen bekommen von meinen Script beim Hochladen einer Datei (nur darauf bezieht sich der FTP Modus, da danach auch PHP die Rechte zum Ändern der Datei haben sollte.)

Btw, bin nun bis Freitag weg, kann also erst dann wieder hier vorbeischauen ;)

Chewie 25. Okt 2005 07:30

Re: [PHP] DirectoryListings Part 2
 
Ach so, was mir bez. Safe Mode noch einfällt: Soweit ich weiß, muss dort der Besitzer (UID) des Pfades, auf den eine IO-Operation agewandt wird mit dem ausführenden Benutzer des Scipts (also dir) übereinstimmen. Schau mal nach, ob du überall als Besitzer deiner Dateien und Ordner eingetragen bist.

Hador 25. Okt 2005 08:23

Re: [PHP] DirectoryListings Part 2
 
Hi Luckie,

Ich habe vor kurzem etwas ähnliches realisiert.
Jedoch bin ich z.Z. inner Schule, und habe deshalb zum einen grad wenig Zeit :wink:
Und zum anderen kann ich das ganze hier schlecht in ein zip-Archiev packen.
Sobald ich zu hause bin, schick ichs dir.

PS: siehe PN

Luckie 25. Okt 2005 09:50

Re: [PHP] DirectoryListings Part 2
 
@chewie: Wie mache ich das denn? Mit FileZilla kann ich die Zugriufssrechte kontrollieren,a ber wie geht das mit dem Besitz?

@Hador: Nicht nötig, wenn ich was fertiges wollte, dann hätte ich schon längst einen gefunden. Aber ich will es ja selber schreiben. Und so lange ich keine Schreibrechte habe, wird deins genauso versagen.

Luckie 25. Okt 2005 10:23

Re: [PHP] DirectoryListings Part 2
 
Nachtrag: ich habe es jetzt mal mi FTP probiert:

Code:
<?php

  $Server = 'luckie-online.de';
  $User = 'foo';
  $PW = 'bar';
 
  function FTPDirList($dir)
  {
     $conn_id = ftp_connect($Server);
     $login_result = ftp_login($conn_id, $User, $PW);
     
     return ftp_nlist($conn_id, $dir);
  }

?>
Das bringt mir allerdings folgende Fehlermeldungen:
Zitat:

Warning: ftp_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/l3s11195/html/Ablage/Privat/WebFTP.php on line 9

Warning: ftp_login() expects parameter 1 to be resource, boolean given in /var/www/l3s11195/html/Ablage/Privat/WebFTP.php on line 10

Warning: ftp_nlist() expects parameter 1 to be resource, boolean given in /var/www/l3s11195/html/Ablage/Privat/WebFTP.php on line 12

Warning: Invalid argument supplied for foreach() in /var/www/l3s11195/html/Ablage/Privat/testFTP.php on line 7
Ich nehme mal an das sind Folgefehler, weil das Verbinden schon nicht geklappt hat. Mich beunruhigt allerdings etwas das Name or service not known, kann es sein, das auch die FTP Funktionen deaktiviert sind? :o Der Server müsste allerdings stimmen, da ich bei meinem FTP Client auch "luckie-online.de" als Host eingetragen habe, nach Anweisung meines Hosters.

Noch ein Nachtrag: Ich muss was falsch machen. Ich habe jetzt ein sehr gutes FTP Script gefunden: http://www.alishomepage.com/FTP/index.php5 :thumb: und damit funktioniert der Uplaod, also muss ich was falsch machen. Nur was? :(

Chewie 25. Okt 2005 11:23

Re: [PHP] DirectoryListings Part 2
 
Zitat:

Zitat von Luckie
@chewie: Wie mache ich das denn? Mit FileZilla kann ich die Zugriufssrechte kontrollieren,a ber wie geht das mit dem Besitz?

Ich verwende FlashFXP und dort gibt es ein Häkchen, um den Owner zu setzen.

Luckie 25. Okt 2005 11:27

Re: [PHP] DirectoryListings Part 2
 
Hm. FileZilla kennt das wohl nicht. Aber ich werde es mit FTP machen, scheint mir auch einfacher zu sein. Desweiteren ist es wohl möglich, dass die einem auch den safe_mode ausschalten, wenn das gewünscht wird.

Ich mache mal ein neues Thema zu dem FTP Kram auf.

Pr0g 28. Okt 2005 23:47

Re: [PHP] DirectoryListings Part 2
 
Zitat:

Zitat von Luckie
Nachtrag: ich habe es jetzt mal mi FTP probiert:

Code:
<?php

  $Server = 'luckie-online.de';
  $User = 'foo';
  $PW = 'bar';
 
  function FTPDirList($dir)
  {
     $conn_id = ftp_connect($Server);
     $login_result = ftp_login($conn_id, $User, $PW);
     
     return ftp_nlist($conn_id, $dir);
  }

?>
Das bringt mir allerdings folgende Fehlermeldungen:[..]

Die Variablen $Server, $User und $PW sind in der Funktion noch nicht bekannt, daher kann es nicht gehen. Füge vor $conn_id = ... noch folgende Zeile ein, um sie bekannt zu machen:
Code:
global $Server, $User, $PW;

Luckie 29. Okt 2005 02:10

Re: [PHP] DirectoryListings Part 2
 
Du bist ziemlich spät dran. Ich habe alles schon gelöst. ,)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz