Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Listowanie plików ze wszystkich katalogów
Forum PHP.pl > Forum > Przedszkole
jurajska
Cześć,
jestem zupełnie początkujący.
Mam skrypt który listuje pliki ze wszystkich katalogów. To czego w nim brakuje to pokazywania daty stworzenia, modyfikacji, coś na wzór plików "index of /" oraz wstępnego ich posortowania po tej dacie.
Oprócz tego, nie działają poprawnie odnośniki do tych plików, jeżeli zawierają polskie litery - lecz to jest wtórny problem.
Poproszę o Waszą pomoc. Z góry dziękuję, MO.
Poniżej skrypt:

  1. <?php
  2. function GetAllLinksFromDir($dir, &$array) {
  3. if($dir[strlen($dir) - 1] != '/') $dir .= '/';
  4. $hand = opendir($dir);
  5. while($file = readdir($hand))
  6. if(is_file($dir.$file))
  7. $array[] = '<a href="'.$dir.$file.'">'.$dir.$file.'</a>';
  8. elseif(is_dir($dir.$file) && $file != '.' && $file != '..')
  9. GetAllLinksFromDir($dir.$file, $array);
  10. closedir($hand);
  11. }
  12. $linki = array();
  13. GetAllLinksFromDir('.', $linki);
  14. ksort($linki);
  15. echo join("<br>\n", $linki);
  16. ?>
  17.  
Pyton_000
Zamiast takich potworków lepiej użyć tego:

  1. $it = new RecursiveDirectoryIterator("/twoj/folder");
  2. foreach(new RecursiveIteratorIterator($it) as $file) {
  3. echo $file . "<br/> \n";
  4. }
jurajska
Dziękuję za szybką odpowiedź.
Rzeczywiście, składnia dużo ładniejsza ;-)
A wracając do mojej prośby - listowane pliki potrzebuję mieć jako linki do nich oraz muszę je mieć posortowane po dacie stworzenia, czyli przesłania na serwer od najnowszych po najstarsze. Miłym byłoby również wyświetlenie tej daty.
Z wyrazami szacunku, MO.

Pyton_000
http://stackoverflow.com/a/26602416/3732803
jurajska
Świetne, lecz listuje mi jedynie zawartość bieżącego katalogu, nie listując plików, które są w podkatalogach.
MO.
Aktualny skrypt:
  1. <body>
  2.  
  3. <?php
  4. $search_path = '/home/test';
  5. $display = array('php');
  6. $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($search_path));
  7. $data = array();
  8. foreach($files as $file) {
  9. $time = DateTime::createFromFormat('U', filemtime($file->getPathname()));
  10. // no need to explode the time, just make it a datetime object
  11. if(in_array($file->getExtension(), $display) && $time > new DateTime('2014-01-15')) { // is PHP and is greater than jan 15 2014
  12. $data[] = array('filename' => $file->getPathname(), 'time' => $time->getTimestamp()); // push inside
  13. }
  14.  
  15. }
  16. usort($data, function($a, $b){ // sort by time latest
  17. return $b['time'] - $a['time'];
  18. });
  19.  
  20.  
  21. foreach ($data as $key => $value) {
  22. $time = date('Y-m-d h:i:sa', $value['time']);
  23. echo "
  24. <span style='color: red;'>
  25. <b style='color: green;'>$time</b> $value[filename]
  26. </span>
  27. <br/>
  28. ";
  29. }
  30.  
  31. ?>
  32.  
  33.  
  34. </body>
  35.  
Pyton_000
jak dla mnie to to działa.listuje wszystkie z podkategoriami włącznie
jurajska
Jest już OK. Mój wzrok zbłądził i nie zauważył, że listowało tylko pliki *.php.
Dodałem również podlinkowanie do tych plików.
Jeszcze jedno pytanie - w jaki sposób ominąć wypisywanie nazw katalogów a zostawić jedynie pliki, które się w nich znajdują?
Przykład:
2015-12-15 15:48:22 ./ftpwbpp/.. -> tego nie chcę wyświetlać
2015-12-15 15:36:32 ./index.php -> OK
2015-12-15 15:36:24 ./ftpklient/arny/151215/.. -> tego nie chcę wyświetlać
2015-12-15 15:36:24 ./ftpklient/arny/Całoœć/.. -> tego nie chcę wyświetlać
2015-12-15 15:36:24 ./ftpklient/arny/. -> tego nie chcę wyświetlać
2015-12-15 15:36:24 ./ftpklient/arny/Poprawki_14122015/.. -> tego nie chcę wyświetlać
2015-12-15 15:36:24 ./ftpklient/arny/Całoœć/. -> tego nie chcę wyświetlać
2015-12-15 15:35:17 ./ftpklient/arny/151215/15.pdf -> OK
2015-12-15 15:35:17 ./ftpklient/arny/151215/16.jpg -> OK

Mój aktualny skrypt:
  1. <body>
  2. <?php
  3. $search_path = './';
  4. $display = array('pdf'); // Zmienna dla wyświetlania konkretnego typu pliku
  5. $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($search_path));
  6. $data = array();
  7. foreach($files as $file) {
  8. $time = DateTime::createFromFormat('U', filemtime($file->getPathname()));
  9. // no need to explode the time, just make it a datetime object
  10. // if(in_array($file->getExtension(), $display) && $time > new DateTime('2014-01-15')) { // is PHP and is greater than jan 15 2014
  11. $data[] = array('filename' => $file->getPathname(), 'time' => $time->getTimestamp()); // push inside
  12. // }
  13. }
  14. usort($data, function($a, $b){ // sort by time latest
  15. return $b['time'] - $a['time'];
  16. });
  17.  
  18.  
  19. foreach ($data as $key => $value) {
  20. $time = date('Y-m-d H:i:s', $value['time']);
  21. echo "
  22. <span style='color: red;'.face='Tahoma, sans-serif'>
  23. <b style='color: green;'>$time</b> <a href=\"http://sub.mojadomena.pl/$value[filename]\"</a> $value[filename]
  24.  
  25. </span>
  26. <br/>
  27. ";
  28. }
  29. ?>
  30. </body>
  31.  


Pozdrawiam,
MO.
viking
W foreach:
  1. if ($file->isDir()) {continue;}


jurajska
Wszystko śmiga jak należy. Poniżej gotowiec dla potomnych.
Bardzo dziękuję wszystkim za pomoc.
Pozdrawiam,
MO.

  1. <body>
  2. <?php
  3. $search_path = './';
  4. $display = array('pdf'); // Zmienna dla wyświetlania konkretnego typu pliku
  5. $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($search_path));
  6. $data = array();
  7. foreach($files as $file) {
  8. if ($file->isDir()) {continue;}
  9. $time = DateTime::createFromFormat('U', filemtime($file->getPathname()));
  10. // no need to explode the time, just make it a datetime object
  11. // if(in_array($file->getExtension(), $display) && $time > new DateTime('2014-01-15')) { // is PHP and is greater than jan 15 2014
  12. $data[] = array('filename' => $file->getPathname(), 'time' => $time->getTimestamp()); // push inside
  13.  
  14. // }
  15. }
  16. usort($data, function($a, $b){ // sort by time latest
  17. return $b['time'] - $a['time'];
  18. });
  19.  
  20.  
  21. foreach ($data as $key => $value) {
  22.  
  23. $time = date('Y-m-d H:i:s', $value['time']);
  24.  
  25. echo "
  26. <span style='color: red;'.face='Tahoma, sans-serif'>
  27. <b style='color: green;'>$time</b> <a href=\"http://mojadomena.pl/$value[filename]\"</a> $value[filename]
  28.  
  29. </span>
  30. <br/>
  31. ";
  32. }
  33. ?>
  34. </body>
  35.  


Witam ponownie,
listowanie działa wyśmienicie. Jest jednak problem z wyświetlaniem polskich znaków w nazwach plików, które były skopiowane na serwer z windowsa za pomocą klienta FTP.
Takie nazwy mają bodajże kodowanie Windows-1250 i w żaden sposób nie potrafię tego listowania przekonwertować do UTF-8.
Z góry dziękuję za sprawdzone w powyższym skrypcie podpowiedzi w jaki sposób konwertować listę plików.
MO.
Pyton_000
  1. $result = iconv('CP1252', 'UTF-8', $string);
jurajska
Próbowałem, nie zamienia.
Ale biorąc pod uwagę że jestem b.początkujący, możliwe że złe zmienne ze skryptu podstawiam do tej funkcji i niepoprawnie ją wyświetlam.
Czy zechcielibyście pomóc mi zastosować tą funkcję w powyższym skrypcie?
Z góry dziękuję, MO.
Pyton_000
Nie wiesz jaka zmienna odpowiada za nazwę pliku?
Pierwszy foreach
jurajska
Zrobiłem, niestety nie zamienia znaków. Również po zmianie z CP1252 na CP1250.
Poniżej screen dwóch plików - jeden wrzucony przez połączenie z FTP via Win-1250 a drugi via UTF-8.
MO.

Pyton_000
kod
jurajska
  1. <body>
  2. <?php
  3. $result = iconv('CP1252', 'UTF-8', $file);
  4. $search_path = './';
  5. $display = array('pdf'); // Zmienna dla wyświetlania konkretnego typu pliku
  6. $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($search_path));
  7. $data = array();
  8. if($_SERVER['REMOTE_ADDR'] !== 'XXX.XXX.XXX.XXX'){
  9. echo "Dostęp zabroniony";
  10. }
  11. foreach($files as $file) {
  12. if ($file->isDir()) {continue;}
  13. $time = DateTime::createFromFormat('U', filemtime($file->getPathname()));
  14. // no need to explode the time, just make it a datetime object
  15. // if(in_array($file->getExtension(), $display) && $time > new DateTime('2014-01-15')) { // is PHP and is greater than jan 15 2014
  16. $data[] = array('filename' => $file->getPathname(), 'time' => $time->getTimestamp()); // push inside
  17. // }
  18. }
  19.  
  20. usort($data, function($a, $b){ // sort by time latest
  21. return $b['time'] - $a['time'];
  22. });
  23.  
  24. foreach ($data as $key => $result) {
  25.  
  26. $time = date('Y-m-d H:i:s', $result['time']);
  27.  
  28. echo "
  29. <span style='color: red;'.face='Tahoma, sans-serif'>
  30. <b style='color: green;'>$time</b> <a href=\"http://mojadomena.pl/$result[filename]\"</a> $result[filename]
  31. </span>
  32. <br/>
  33. ";
  34. }
  35. ?>
  36. </body>
Pyton_000
facepalmxd.gif

  1. foreach($files as $file) {
  2. if ($file->isDir()) {continue;}
  3. $time = DateTime::createFromFormat('U', filemtime($file->getPathname()));
  4. // no need to explode the time, just make it a datetime object
  5. // if(in_array($file->getExtension(), $display) && $time > new DateTime('2014-01-15')) { // is PHP and is greater than jan 15 2014
  6. $filename = iconv('CP1250', 'UTF-8', $file->getPathname());
  7. $data[] = array('filename' => $filename, 'time' => $time->getTimestamp()); // push inside
  8. // }
  9. }
jurajska
Dzięki za pomoc.
Pomogło i tak i nie, a mianowicie. Zamienia z CP1250 na UTF-8, ale nazwy plików z polskimi znakami wysłane via UTF-8 zamienia na krzaki.
Dodatkowo mam też problem z pobraniem pliku z przeglądarki. Gdy przeglądarka w adresie zamienia spacje na %20 to jeszcze jest ok, ale przy próbie pobrania pliku z polskim znakiem w nazwie, przekazuje te znaki przy pomocy innych %-kodów.
Więc pytanie jest takie, czy da się w jakikolwiek sposób pobrać plik z polskimi znakami w nazwie przez przeglądarkę? Teraz się zastanawiam, czy nie porzucić tego "projektu" na rzecz zamiany polskich znaków na te bez ogonków a spacje na podkreślenia...
MO.
breadi
Witam, zastosowałem się do powyższego kodu, wszystko ładnie działa, tylko mam jedno pytanko jak można pozbyć się pełnej ścieżki do pliku z
  1. $result['filename']
tak aby wyświetliła sie tylko nazwa pliku?
Pyton_000
basename
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.