Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Katalog interpretowany przez php jako plik
Forum PHP.pl > Forum > Przedszkole
L_Dev
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.
L_Dev
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 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.
mog
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.
L_Dev
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...
crash
Linia 9:
  1. <?php
  2. if(!is_dir($file)){
  3. ?>

zmien na:
  1. <?php
  2. if(!is_dir($dir.$file)){
  3. ?>
Guest
Działa! Wielkie dzięki biggrin.gif
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.