Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przechodzenie po katalogach
Forum PHP.pl > Forum > Przedszkole
beskid
Witam, przeglądnąłem forum, ale nie znalazłem nic, co kompleksowo rozwiązałoby mój problem. Otóż chcę napisać skrypt listujący zawartość katalogu, oraz jeśli zawiera on inne katalogi, aby umożliwiał "wejście" w niego i wylistowanie. Poniżej przedstawiam mój kod. Problem polega na tym że mimo że można "wejść" w podkatalogi, to zawarte w nim pliki są traktowane jako katalogi i np. nie liczy ich rozmiaru. Jeśli ktoś znalazłby błąd w skrypcie, albo jakąś sugestię to bardzo dziękuję.

  1. <?php
  2. if(empty($_GET[&#092;"path\"]))
  3.    $path=&#092;".\";
  4. else
  5.    $path=$_GET[&#092;"path\"];
  6.  
  7. $directory=@opendir($path) 
  8.    or die(&#092;"Cannot  open stream to directory <b>$directory</b>\");
  9.  
  10. $table=array();
  11. $table_dir=array();
  12.  
  13. while (gettype($file=readdir($directory))!=boolean) 
  14. {
  15.    if(is_file($file))
  16.       array_push($table,$file);
  17.    elseif($file!=&#092;".\")
  18.       array_push($table_dir,$file);
  19. }
  20.  
  21. sort($table);
  22. sort($table_dir);
  23.  
  24. foreach($table_dir as $value) 
  25. {
  26.    print &#092;"<a href=?path=$path/$value>\".$value.\"</a> --<br>\";
  27. }
  28. foreach($table as $value) 
  29. {
  30.    if(($rozmiar=filesize($value))>=1024*1024)
  31.      $rozmiar=round($rozmiar/(1024*1024)).&#092;" <b>M</b>\";
  32.    elseif($rozmiar>=1024)
  33.      $rozmiar=round(($rozmiar/1024)).&#092;" <b>k</b>\"; 
  34.  
  35.    print &#092;"<a href=$value>\".$value.\"</a> $rozmiar<br>\";
  36. }
  37. closedir($directory);
  38. ?>
marlowe
Myślę, że to Ci będzie odpowiadać:
  1. <?php
  2. $nazwa_pliku = &#092;"dir.php\"; //nazwa tego pliku
  3. function listDir($dir)
  4. {
  5. chdir($dir);
  6. $dir = getcwd();
  7. $fd = opendir($dir);
  8. if(!$fd) return false;
  9. while (($file = readdir($fd)) !== false){
  10.  if($file == &#092;".\") continue;
  11.  if(is_dir($dir.&#092;"\".$file))
  12.  {
  13. $link = &#092;"<a href=\"http://127.0.0.1:80/$nazwa_pliku.php?\";
  14. $link .= &#092;"dir=\".$dir.\"\".$file.\"\">\".$file.\"</A>\";
  15. $link = str_replace(&#092;"\", \"\", $link);
  16. echo(&#092;"$link\");
  17.  }
  18.  else
  19. {
  20. echo(&#092;"$file\");
  21.  }
  22.  echo(&#092;"<BR>\");
  23. }
  24. closedir($fd);
  25. }
  26. @$dir = $_GET['dir'];
  27. if($dir == '') $dir = &#092;".\";
  28. listDir($dir);
  29. ?>

Pozdrawiam.
Bartek
PS Forum zamieniło mi ! na &#33; i \ na &#092; - popraw to sobie.
a79rtur
powyższy skrypt "poszedł" mi, na podanej w sygnaturce konfiguracji po drobnych przeróbkach:

  1. <?php
  2. $nazwa_pliku = substr($PHP_SELF,1); //nazwa tego pliku
  3. function listDir($dir)
  4. {
  5. global $nazwa_pliku;
  6. chdir($dir);
  7. $dir = getcwd();
  8. $fd = opendir($dir);
  9. if(!$fd) return false;
  10. while (($file = readdir($fd)) != false){
  11.  if($file == &#092;".\") continue;
  12.  if(is_dir($dir.&#092;"\".$file))
  13.  {
  14. $link = &#092;"<a href=\"http://127.0.0.1:80/\".$nazwa_pliku.\"?\";
  15. $link .= &#092;"dir=\".$dir.\"\".$file.\"\">\".$file.\"</A>\";
  16. $link = str_replace(&#092;"\", \"\", $link);
  17. echo (&#092;"$link\");
  18.  }
  19.  else
  20. {
  21. echo(&#092;"$file\");
  22.  }
  23.  echo(&#092;"<BR>\");
  24. }
  25. closedir($fd);
  26. }
  27. @$dir = $_GET['dir'];
  28. if($dir == '') $dir = &#092;".\";
  29. listDir($dir);
  30. ?>
magnoom
Witam

Właśnie pracuję nad czymś podobnym i postanowiłem odświerzyć temat. Zastanawiam się czy bezpiecznym jest przekazywanie metodą GET całej struktury katalogów na serwerze? Pracując na localhoscie i sprawdzając wasze propozycje w zmiennej $dir przekazywana jest cała ścieżka począwszy od C:
Cytat
http://127.0.0.1/skrypt.php?dir=c:\apache\htdocs\katalog

Czy nie ułatwia to zadania chcącym poszperać tam gdzie nie powinni?
Jak ukryć wszystko to, co znajduje się ponad katalogiem z tym skryptem, a jednocześnie umożliwić wyświetlanie wszystkiego w dół?

Pozdrawiam
Damian
FiDO
Np. podajac w URL'y sciezke wzgledna, ktora doklejasz potem do odgornie ustalonego katalogu. Wypadalo by jednak jeszcze ta sciezke wzgledna odfiltrowac z wszelkich ../
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.