Rozdział 5. ♦ Przetwarzanie danych z przeglądarki 151
Katalog jest otwierany za pomocą funkcji opendi r, a deskryptor tego katalogu jest przypisywany zmiennej fd. Nazwy znajdujących się w tym katalogu plików są odczytywane w pętli whlle za pomocą funkcji readdir. Każde wywołanie readdir zwraca nazwę / jednego pliku, która to nazwa jest przypisywana zmiennej fi 1 e. W przypadku gdy zostaną odczytane nazwy wszystkich plików, wywołanie readdir zwróci wartość false i pętla whi 1 e zakończy działanie. W pętli whi 1 e znajduje się instrukcja warunkowa i f, która pozwala na pominięcie nazw wszelkich podkatalogów. Za sprawdzenie, czy odczytana nazwa jest nazwą katalogu, odpowiada funkcja i s_dir. W ten sposób skrypt PHP wygeneruje automatycznie kod HTML zawierający listę odnośników, który w poprzednim przykładzie był tworzony ręcznie (listing 5.10). Tym samym zmiana zawartości katalogu z plikami do pobrania nie będzie wymagała żadnej modyfikacji kodu.
Druga część zadania to napisanie skryptu downloadphp, do którego odwołuje się każdy z odnośników. Jego realizacja będzie oczywiście bardzo podobna do poprzedniego przykładu. W rzeczywistości należy jedynie wymienić funkcję checkFileName — pozostałe elementy możemy pozostawić praktycznie bez zmian. Funkcja checkFileName będzie tym razem przyjmowała dwa parametry, którymi są: nazwa pliku (fi 1 e) oraz nazwa katalogu (path). Kod funkcji będzie podobny do kodu funkcji printList z listingu 5.12. Katalog wskazany argumentem path zostanie otworzony za pomocą funkcji opendir, a następnie w pętli while będzie odczytywana jego zawartość. Każda odczytana nazwa zostanie zapisana w zmiennej file i, o ile nie jest katalogiem, porównywana z argumentem name. W ten sposób sprawdzimy, czy nazwa przekazana do skryptu w postaci parametru faktycznie odpowiada nazwie jednego z plików znajdujących się w katalogu wskazywanym przez filesPath. Jeżeli plik uda się odnaleźć, funkcja checkFileName zwróci wartość true, a w przeciwnym przypadku — wartość false. Pełny kod skryptu został zaprezentowany na listingu 5.13.
Listing 5.13. Kod skryptu wysyłającego plik do użytkownika_
<?php
IfilesPath = "./downloads/":
function checkFileName($name. $path)
$fd = opendir($path): if(!$fd) return false: while ((Sfile - readdir(Ifd)) !== false){ if(is_dir<Ipath.$fi 1e)) continue: if($file == Sname) return true:
c1osedir<$fd): return false:
function send($fileName. SfilePath)
i f(!file_exi sts($fi1ePath.$fi 1 eName)){ echoCNie ma takiego pliku na serwerze!'): return:
$fd = fopen($filePath.$fileName.''r”):
Ssize - filesize($filePath.$fileName):
Scontents = fread($fd. filesize($filePath.$fileName)):