Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Katalog interpretowany przez php jako plik
-L_Dev-
post
Post #1





Goście







ZAWARTOŚĆ ROOT:
test.php
folder /galery/

ZAWARTOŚĆ /galery/:
plik cos.jpg
folder /mini/

ZAWARTOŚĆ /mini/
plik cos.jpg (pomniejszona wersja tego u góry)

  1. <?php
  2. //Folder z galerią
  3. $dir = &#092;"./galery/\";
  4.  
  5. if (is_dir($dir)) {
  6. if ($directory = opendir($dir)) {
  7. while (($file = readdir($directory))) {
  8.  
  9. if(!is_dir($file)){
  10. $size = filesize($dir.$file)/1024; //pobieram wielkość pliku i przeliczam ją na kb
  11. $size = (int) $size; //Usuwam ułamki
  12. echo &#092;"<a href=\".$dir.$file.\"><img src=\".$dir.\"mini/\".$file.\" alt=\".$file.\"(\".$size.\"kb)></a><br />\"; //Jako href, zostaje zapisany link do oryginalnego pliku, a jako img src zostaje z
  13. pisany plik miniaturka.
  14. }
  15. }
  16. closedir($directory);
  17. }
  18. }
  19. ?>

Wszystko byłoby cacy, gdyby nie fakt, że php dopatrzył się dwóch plików w folderze galery, nie będących katalogami:
cos.jpg
i mini
(kod HTML wygenerowany przez tą operację)
  1. <a href=./galery/cos.jpg><img src=./galery/mini/cos.jpg alt=cos.jpg(46kb)></a><br />
  2. <a href=./galery/mini><img src=./galery/mini/mini alt=mini(0kb)></a><br />

Czyli warunek if w linii 9 stwierdził, że /mini/ nie jest folderem.

Zmieniłem na chwilę warunek na
  1. <?php
  2. if(is_dir($file))
  3. ?>
i ku memu zdziwieniu wyświetlił tylko foldery . i .. (bez mini).

Skrypt był testowany na Windowsowym Apachu.
Go to the top of the page
+Quote Post
-L_Dev-
post
Post #2





Goście







Przetestowałem z funkcją
  1. <?php
  2. $type = filetype($dir.$file);
  3. echo $type;
  4. ?>
przy każdym ładowaniu plików. Zwróciło - dir dir file dir. Jeżeli użyję funkcji "!is_dir" - zwraca True dla dwóch ostatnich. Z ciekawości zastąpiłem ją funkcją "is_file" - okazało się że w KAŻDYM przypadku zwróciła false. Czyli według skryptu nic w tym folderze nie jest plikiem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Wyświetlanie typów podsunęło mi jednak alternatywne rozwiązanie - poprawiłem felerny warunek na
  1. <?php
  2. $type = filetype($dir.$file);
  3. if($type == &#092;"file\"){
  4. ?>
Teraz działa, niemniej wymaga do tego 1 dodatkowej linijki kodu.
Nadal jestem ciekaw co powoduje takie dziwne wyniki użycia funkcji is_file i is_dir.
Go to the top of the page
+Quote Post
mog
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 13.11.2004

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


void clearstatcache(void);
powinno pomóc. o ile się nie mylę, miałem kiedyś podobny problem i to pomogło ( każde sprawdzenie informacji o pliku, w tym chociażby `is_dir` jest przechowywane w cache'u i wpływa nierzadko na kolejne sprawdzenia...). wywołanie tej funkcji po każdym sprawdzeniu powinno rozwiązać problem.

Ten post edytował mog 25.12.2004, 00:42:12
Go to the top of the page
+Quote Post
-L_Dev-
post
Post #4





Goście







Wpisałem
  1. <?php
  2. void clearstatcache(void);
  3.  
  4. ?>
i dało
Cytat
Parse error: parse error in C:\Program Files\Apache Group\Apache2\htdocs\test\test.php on line 14
, poprawiłem na
  1. <?php
  2. ?>
i dalej katalog jest intepretowany jako plik...
Go to the top of the page
+Quote Post
crash
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

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


Linia 9:
  1. <?php
  2. if(!is_dir($file)){
  3. ?>

zmien na:
  1. <?php
  2. if(!is_dir($dir.$file)){
  3. ?>
Go to the top of the page
+Quote Post
-Guest-
post
Post #6





Goście







Działa! Wielkie dzięki (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 17.09.2025 - 20:55