Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Listowanie plików ze wszystkich katalogów
jurajska
post 15.12.2015, 11:07:27
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.  
Go to the top of the page
+Quote Post
Pyton_000
post 15.12.2015, 11:17:50
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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. }
Go to the top of the page
+Quote Post
jurajska
post 15.12.2015, 11:40:50
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.

Go to the top of the page
+Quote Post
Pyton_000
post 15.12.2015, 11:56:30
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


http://stackoverflow.com/a/26602416/3732803
Go to the top of the page
+Quote Post
jurajska
post 15.12.2015, 13:08:30
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


Ś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.  
Go to the top of the page
+Quote Post
Pyton_000
post 15.12.2015, 13:30:01
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


jak dla mnie to to działa.listuje wszystkie z podkategoriami włącznie
Go to the top of the page
+Quote Post
jurajska
post 15.12.2015, 16:00:18
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.
Go to the top of the page
+Quote Post
viking
post 15.12.2015, 16:17:21
Post #8





Grupa: Zarejestrowani
Postów: 6 376
Pomógł: 1116
Dołączył: 30.08.2006

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


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




--------------------
Go to the top of the page
+Quote Post
jurajska
post 28.12.2015, 07:45:13
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post 28.12.2015, 07:53:33
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


  1. $result = iconv('CP1252', 'UTF-8', $string);
Go to the top of the page
+Quote Post
jurajska
post 28.12.2015, 08:15:38
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post 28.12.2015, 08:45:38
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie wiesz jaka zmienna odpowiada za nazwę pliku?
Pierwszy foreach
Go to the top of the page
+Quote Post
jurajska
post 28.12.2015, 10:00:36
Post #13





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.

Go to the top of the page
+Quote Post
Pyton_000
post 28.12.2015, 10:25:22
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


kod
Go to the top of the page
+Quote Post
jurajska
post 28.12.2015, 10:48:08
Post #15





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


  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>
Go to the top of the page
+Quote Post
Pyton_000
post 28.12.2015, 10:53:54
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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. }
Go to the top of the page
+Quote Post
jurajska
post 28.12.2015, 11:45:40
Post #17





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.12.2015

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


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.
Go to the top of the page
+Quote Post
breadi
post 26.12.2016, 13:53:09
Post #18





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 9.04.2015

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


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?
Go to the top of the page
+Quote Post
Pyton_000
post 27.12.2016, 10:26:20
Post #19





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


basename
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 Wersja Lo-Fi Aktualny czas: 28.04.2025 - 07:56