Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] listowanie i przegladanie folderow/plikow - problem, cos sie posypuje ...
wilman
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


Witam!
Mam kod, który listuje mi zawartość katalogu. Katalog pobierany jest z adresu strony np index.php?katalog=./ , chciałbym zrobić tak, żeby można było swobodnie poruszać się po katalogach, a jeśli w katalogu są pliki to wydrukować do nich bezpośrednie linki np. qwe/rty/uiop/plik.rozszerzenie . W moim przypadku listowanie katalogu działa ale tylko do drugiego poziomu, a dalej drukuje mi nie taką ścieżkę jaką powinien. Czysto dla sprawdzenia w kodzie umieściłem żeby drukował [plik] lub [katalog] w zależności od typu drukowanej zawartości, ale przy drugim poziomie (katalog w katalogu) już się sypie bo przy folderach drukuje [plik].
  1. <? 
  2. if(empty($_GET['sciezka'])) { $_GET['sciezka']='./'; } 
  3. $folder = htmlspecialchars(nl2br(strip_tags($_GET['sciezka'])));
  4.  
  5. echo "Znajdujesz się w <b>$sciezka</b><br/><a href="javascript:history.go(-1)">[wróć]</a><br /> ";
  6. $dir = dir($folder);
  7. while ($file = $dir->read()) {
  8.  
  9. if (is_dir($file)) {
  10. $folder = substr($folder, 1);
  11. $adres = "<a href="index.php?sciezka=./$folder$file">$file [katalog]</a> n ";
  12. if (!(($file=='.') || ($file=='..')))
  13. $d[] = '[ '.$adres.' ]';
  14. } else {
  15. $adres = "<a href="/$folder/$file">$file [plik]</a>n ";
  16. $l[] = $adres; } 
  17. }
  18. $dir->close();
  19. if ((isset($d)) && (count($d)<>0))
  20. {
  21.  sort($d);
  22.  for ($i=0;$i<count($d);$i++)
  23. echo $d[$i]."<br />rn";
  24. }
  25. if ((isset($l)) && (count($l)<>0))
  26. {
  27.  sort($l);
  28.  for ($j=0;$j<count($l);$j++)
  29. echo $l[$j]."<br />rn";
  30. } else
  31.  echo('Katalog jest pusty!');
  32. ?>



Gdyby ktoś mógł mi pomóc, byłbym wdzięczny
Pozdrawiam

pe-es: jak zabezpieczyć ten skrypt ?
Go to the top of the page
+Quote Post
Wave
post
Post #2





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

Ostrzeżenie: (0%)
-----


Użyj rekurencji ( napisz funkcję która indeksuje pliki a po napotkaniu katalogu wywołuje samą siebie ).
Go to the top of the page
+Quote Post
wilman
post
Post #3





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


chyba nie zrozumiales oco mi chodzi, albo ja nie rozumiem Twojej wskazowki biggrin.gif

no bo jesli mam funkcje, ktora listuje pliki, natrafi na katalog i ma wywolac sie jeszcze raz, to co mi to da ?
Go to the top of the page
+Quote Post
Wave
post
Post #4





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

Ostrzeżenie: (0%)
-----


To Ci da, że zindeksujesz wszystkie poziomy zamiast tylko dwóch.

Ten post edytował Wave 11.02.2007, 18:07:10
Go to the top of the page
+Quote Post
wilman
post
Post #5





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


to w takim razie ja nie rozumiem haha.gif

a patrzyles w moj kod, bo czysto teoretycznie powinno wszystko dzialac, a nie dziala bo popelnilem jakis blad, mozesz mi go pokazac ?
Go to the top of the page
+Quote Post
Wave
post
Post #6





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

Ostrzeżenie: (0%)
-----


Linia 11:
  1. <?php
  2. $adres = "<a href="kat.php?sciezka=".$_GET['sciezka'].$file."/">$file [katalog]</a> n ";
  3. ?>
Go to the top of the page
+Quote Post
wilman
post
Post #7





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


hmm...
dziala tak jak dzialalo, nadal na drugim sie sypie.
Czy nie wystarczy tylko poprawic tego kodu? Bo jezeli nie to napisze rekurencyjnie (o ile mi sie uda) tak jak pisales smile.gif
Go to the top of the page
+Quote Post
Wave
post
Post #8





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

Ostrzeżenie: (0%)
-----


No, a zmieniłeś tak samo linię 15? W poprzednim kodzie zapomniałem dać index.php zamiast kat.php.
  1. <?php
  2. $adres = "<a href="".$_GET['sciezka'].$file."">$file [plik]</a>n ";
  3. ?>
Go to the top of the page
+Quote Post
wilman
post
Post #9





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


tak, zmieniłem.
Na drugim poziomie przy kazdej pozycji drukuje [plik] wiec mniej wiecej wiadomo gdzie jest blad, ale nie wiem jak go poprawic sad.gif

edit:
tutaj jest przyklad dzialania ..
( w folderze 'stary' sa foldery 'bum' i 'bla' )

Ten post edytował wilman 11.02.2007, 22:39:11
Go to the top of the page
+Quote Post
Coen
post
Post #10





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 12.02.2007

Ostrzeżenie: (0%)
-----


Cytat
Czy nie wystarczy tylko poprawic tego kodu? Bo jezeli nie to napisze rekurencyjnie (o ile mi sie uda) tak jak pisales

moim zdaniem pisanie czegos takiego nie-rekurencyjnie to masochizm w najczystszej postaci tongue.gif
robie aktualnie cos podobnego
byc moze moje wypociny beda uzyteczne, a juz napewno masz przyklad rekurencji
  1. <?php
  2. function DirTree($root_dir,$num,$heap)
  3.  {
  4. $heap[$num] = $root_dir.'/'; // <-- To jest taki niby stos tongue.gif
  5. $dir = implode(NULL,$heap);
  6. $tab = SetTabulator($num);
  7. $list = scandir($dir);
  8.  
  9. $output = '<table border="1" align="center" cellspacing="0" width="800">';
  10.  
  11. $list = SortList($dir,$list);
  12. for($i=2;$i<count($list);$i++)
  13. {
  14.  
  15.  if (is_dir($dir.$list[$i]))
  16.  {
  17.  
  18. $output .= '<tr><td><a href="run.php?name='.$list[$i].'">'.$list[$i].'</a></td><td align="right">DIR</td>'."n";
  19. if($_SESSION[$list[$i]] == 'open') 
  20. {
  21.  $output .= "n<tr><td>";
  22.  $output .= DirTree($list[$i],$num+1,$heap);
  23.  $output .= "</td></tr>n";
  24. }
  25.  }
  26.  
  27.  else { 
  28. $output .= '<tr><td> '.$list[$i].'</td><td align="right" width="80">'.MyFileSize($dir.$list[$i])."</td></tr>n"; }
  29. }
  30. $output .= '</table>';
  31. return $output;
  32.  }
  33. ?>

wywoluje ja tak:
  1. <?php
  2. echo DirTree('',0,''); // Jesli chce zaczac od katalogu glownego
  3. ?>

Funkcje SetTabulator MyFileSize SortList maja charakter czysto kosmetyczny, mozna je wywalic.
Po drobnych przerobkach powinno hulac rowniez u ciebie smile.gif
To dziala tylko pod php5
Go to the top of the page
+Quote Post
Setesh
post
Post #11





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


A patrzyłeś jakie prawa mają te "pliki" ?

Nie bawię się w linuxie za bardzo ale wszystkie pliki w linuxie mogą być folderami - zależy od odpowiednich praw

oczywiście mogę się mylić ale to tak na pierwszy rzut oka mi się zaczeło wydawać smile.gif


--------------------
Znudził Ci się wygląd twojej v39'ki ? Zmień to! :)

| Google | CodeGear | Swiss Delphi Center (ENG) | digitalmars.com | 4programmers.net | dsdt.info | BinBoy | delphi.cartall.com.pl | CPW.net.pl | cyfbar.republika.pl|
Go to the top of the page
+Quote Post
wilman
post
Post #12





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


localhosta mam na Windowsie
Go to the top of the page
+Quote Post
Wave
post
Post #13





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

Ostrzeżenie: (0%)
-----


  1. <? 
  2. if( empty( $_GET['sciezka'] ) ) $_GET['sciezka'] = './';
  3. $folder = htmlspecialchars( nl2br( strip_tags( $_GET['sciezka'] ) ) );
  4.  
  5. echo 'Znajdujesz się w <b>' . $folder . '</b><br /><a href="java script:history.go(-1)">[wróć]</a><br />';
  6. $dir = dir($folder);
  7. $l = $d = array();
  8. while( $file = $dir->read() )
  9. {
  10. if( is_dir( $folder . $file ) )
  11. {
  12. if( $file != '.' && $file != '..' )
  13. $d[] = '[ <a href="?sciezka=' . $folder . $file . '/">' . $file . '</a> ]';
  14. }
  15. else $l[] = '<a href="' . $folder . $file . '">' . $file . '</a>'; 
  16. }
  17. $dir->close();
  18.  
  19. if( !empty( $d ) )
  20. {
  21. sort( $d );
  22. for( $i=0; $i<count($d); $i++ ) echo $d[$i] . "<br />rn";
  23. }
  24. if( !empty( $l ) )
  25. {
  26. sort( $l );
  27. for( $j=0; $j<count($l); $j++ ) echo $l[$j]."<br />rn";
  28. } else echo('Katalog jest pusty!');
  29. ?>
Go to the top of the page
+Quote Post
wilman
post
Post #14





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.02.2007

Ostrzeżenie: (0%)
-----


Dzieki wielkie, wszystko śmiga.
Pozdrawiam
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:05