Pierwszym sposobem na rozwiązanie problemu uploadera plików na serwer jest rozdanie dostępu na serwer każdemu użytkownikowi. Co jeśli jednak nie mamy pełnego zaufania do osoby, która korzysta z naszych skryptów?
Wtedy pozostaje nam możliwość samodzielnego umieszczania wszystkich potrzebnych plików na serwerze, na prośbę konkretnego użytkownika. Po pewnym czasie można jednak stwierdzić, że jest to dość kłopotliwe, a przy większej liczbie użytkowników wręcz nie do wytrzymania. Pozostaje nam wtedy tylko jedno rozwiązanie. Polega ono na skonstruowaniu skryptu, który umożliwia dodawanie plików z poziomu przeglądarki, bez potrzeby podawania haseł dostępu na serwer.
W celu stworzenia takiego skryptu, niezbędna będzie umiejętność posługiwania się katalogami w języku PHP. Cała budowa funkcji umożliwiających dodawanie plików nie jest skomplikowana i ogranicza się do jednej funkcji. My jednak postaramy się napisać skrypt, który umożliwia administrację wszystkimi plikami dodawanymi na serwer za pomocą upload’era. Na dobry początek utwórz katalog, w którym umieszczane będą dodawane pliki. Ja nazwę go ‘materialy’. Teraz wszystkie pliki potrzebne do działania skryptu będziemy umieszczać w katalogu nadrzędnym do utworzonego przed chwilą katalogu zawierającego upload’owane pliki.
Dodawanie pliku
Otwórz dowolny edytor tekstowy (np. Notatnik) i zapisz nowy dokument jako ‘dodaj.php’. Na samym początku skryptu sprawdzimy czy zostały wprowadzone wszystkie potrzebne dane, aby można było upload’ować plik.
<? if (isset($_POST[‘plik’]) && $_POST[‘plik’] != ” && isset($_POST[‘nazwa’]) && $_POST[‘nazwa’] != ”) { |
Teraz należałoby sprawdzić czy plik o podanej nazwie już istnieje w naszym katalogu. W przypadku, gdy zostanie znaleziony, to w dalszej części skryptu zostanie zwrócony stosowny komunikat.
if (!file_exists($katalog.’/’.$_POST[‘nazwa’])) { if (copy($_POST[‘plik’], $katalog.’/’.$_POST[‘nazwa’])) { @chmod($katalog.’/’.$_POST[‘nazwa’], 666); print ‘Plik został dodany.’; } else { print ‘Nie można było dodać pliku.’; } } else { print ‘Plik o podanej nazwie już istnieje.’; } |
Po sprawdzeniu czy wskazany plik istnieje przeszliśmy do etapu dodania pliku na serwer. Skorzystaliśmy tu z funkcji ‘copy()’. Posiada ona dwa parametry. Pierwszy to plik, który chcemy dodać na serwer, a drugi to nazwa i miejsce docelowe na serwerze umieszczanego pliku. Następnym ważnym elementem skryptu jest zmiana uprawnień dostępu do pliku za pomocą funkcji ‘chmod’. Kiedy wiemy, że plik został poprawnie dodany, to do zmiennej ‘$kom’ przypisujemy odpowiedni komunikat. W przypadku, gdy tak nie jest, to także przypisujemy stosowny komunikat. Jeśli z kolei plik o podanej nazwie już istnieje na serwerze, to także i o tym będzie informował odpowiedni komunikat przypisany do zmiennej ‘$kom’. Na samym końcu wyświetlamy zawartość zmiennej ‘$kom’. Zakończeniem działalności naszego skryptu będzie wyświetlenie formularza, za pomocą, którego wprowadzane będą parametry nowego pliku.
} else { ?> W celu dodania pliku należy wybrać jego lokalizację na dysku, a następnie wskazać odpowiednią nazwę, pod jaką będzie przechowywany na serwerze.<br><br> <form method=”POST”> <input type=”hidden” name=”do” value=”dodaj”> <input type=”hidden” name=”MAX_FILE_SIZE” value=”500000″> Nazwa pliku na serwerze: <input type=”text” name=”nazwa” size=”43″><br> Lokalizacja: <input type=”file” name=”plik” size=”25″><br> <input type=”submit” value=”dodaj”> </form> <? } ?> |
Tak gotowy skrypt dodawania możesz zapisać i przejść do następnej części.
Przeglądanie wszystkich plików
Otwórz edytor tekstu i zapisz nowy dokument jako ‘pokaz.php’. Następnie zapoznaj się z poniższym kodem:
Aby usunąć plik należy zaznaczyć znajdujące się przy nim pole ‘checkbox’ a następnie wcisnąć przycisk ‘usuń’. Na raz można usunąć jeden lub więcej plików<br><br> <div align=”center”> <form method=”POST”> <input type=”hidden” name=”do” value=”usun”> <table cellpadding=”2″ cellspacing=”1″> <tr> <th width=”30″ height=”15″ align=”center” valign=”middle”>Lp.</th> <th width=”120″ height=”15″ align=”center” valign=”middle”>Nazwa pliku</th> <th width=”40″ height=”15″ align=”center” valign=”middle”>Zaznacz</th> </tr> |
Na początku zapisaliśmy krótką informację dotyczącą usuwania danych, a następnie wstępny formularz i układ tabelek, które posłużą nam do usytuowania pobieranych danych. Teraz możemy przystąpić do właściwego kodu:
<? $kat = dir($katalog); $i=1; while($poz = $kat->read()) { if (preg_match(“/^.+..+$/i”, $poz)) { print ‘<tr> <td height=”15″ align=”left” valign=”middle”>’.$i.'</td> <td height=”15″ align=”left” valign=”middle”><a href=”‘.$katalog.’/’.$poz.'” target=”_new”>’.$poz.'</a></td> <td height=”15″ align=”center” valign=”middle”><input type=”checkbox” name=”co[]” value=”‘.$poz.'”></td> </tr>’; $i++; } } $kat->close(); |
Jak już wspominałem wcześniej będzie wymagana tutaj znajomość operacji na katalogach, gdyż nie będę wyjaśniał działania poszczególnych elementów należących do tej dziedziny języka PHP. Jeśli nie nie posiadasz takiej wiedzy to polecam przeczytać odpowiedni artykuł. Na koniec należy zakończyć strukturę formularzy oraz tabelek.
?> </tr> </table> <br> <input type=”submit” value=”usuń zaznaczone”> </form> </div> |
Po zapisaniu powyższego kodu możesz przystąpić do następnego etapu.
Usuwanie plików
Otwórz dowolny edytor tekstowy i zapisz nowy dokument jako ‘usun.php’. Na samym początku skryptu sprawdzimy czy zostały podane nazwy plików, aby można było je usunąć.
<? if (isset($_POST[‘co’]) && count($_POST[‘co’]) != 0) { $popr = 0; $co = $_POST[‘co’]; $kat = dir($katalog); while ($poz = $kat->read()) { if (preg_match(“/^.+..+$/i”, $poz)) { for ($j=0; $j < count($co); $j++) { if ($poz == $co[$j]) { $popr = (unlink($katalog.’/’.$poz)) ? $popr+1 : $popr; } } } } $kat->close(); |
Stworzyliśmy nową zmienną ‘$popr’, która pomoże nam w określeniu poprawności wykonania skryptu. Po otworzeniu katalogu, sprawdzamy, które z wymienionych nazw plików pasują do zawartych nazw w tablicy ‘$co’, która przechowuje dane pobrane z formularza. W przypadku, gdy któraś z nazw pasuje, to jest usuwana i jeśli funkcja ‘unlink()’ zwróci wartość ‘true’ to wartość zmiennej ‘$popr’ jest zwiększana o ‘1’, w przeciwnym wypadku, pozostaje bez zmian. Następnym elementem będzie sprawdzenie czy liczba poprawnie usuniętych plików (czyli wartość ‘$popr’) jest równa liczbie elementów tablicy ‘$co’. W zależności od wyniku, zwróconego przez to porównanie, wyświetlany jest stosowny komunikat. Na zakończenie w przypadku, gdy nie został spełniony pierwszy warunek na początku skryptu, wyświetlany jest komunikat informujący o braku danych do usunięcia.
if (count($_POST[‘co’]) == $popr) { print ‘Wskazane pliki zostały usunięte.’; } else { print ‘Nie można było usunąć kilku lub wszystkich z wybranych plików.’; } } else { print ‘Nie zostały zaznaczone pliki do usunięcia.’; } ?> |
Ostatnim elementem potrzebnym do całkowitego działania skryptu będzie skonstruowanie pliku głównego z menu umożliwiającym korzystanie ze stworzonych wcześniej modułów.
Plik główny
Otwórz edytor tekstu i zapisz nowy dokument jako ‘index.php’. Następnie zastosuj się do poniższego kodu:
<? $do = $_GET[‘do’]; $katalog = ‘materialy’; ?> |
Na początku utworzyliśmy zmienną ‘$katalog’, która przechowuje nazwę katalogu, w którym są przechowywane pliki. Następnie tworzymy konstrukcję strony www z tabelką, w której jedna komórka zawiera menu i druga komórka skrypt, który będzie ładował odpowiednie elementy strony.
<html> <head> </head> <body> <table cellpadding=0 cellspacing=0 border=1> <tr> <td width=170 height=300 align=left valign=top> <b>Menu</b><br><br> » <a href=index.php?do=pokaz>pokaż wszystkie </a><br> » <a href=index.php?do=dodaj>dodaj plik</a><br> </td> <td width=400 align=left valign=top> <? if (!$do || $do == ‘pokaz’) { print ‘<b>Wszytskie pliki na serwerze</b><br><br>’; include(‘pokaz.php’); } elseif ($do == ‘dodaj’) { print ‘<b>Dodawanie pliku na serwer</b><br><br>’; include(‘dodaj.php’); } elseif ($do == ‘usun’) { print ‘<b>Usuwanie pliku z serwera</b><br><br>’; include(‘usun.php’); } else { print ‘<b>error 404</b><br><br>Nie ma takiej strony!’; } ?> </td> </tr> </table> </bode> </html> |
Tak otrzymany skrypt jest już gotowy do wykorzystania. Nie jest w pełni zabezpieczony, ale myślę, że spełni Twoje wymagania, chociaż częściowo. Jeśli chcesz możesz rozbudować zamieszczone tutaj funkcje i stworzyć o wiele lepszy krypt, ale wszystko zależy tylko od Ciebie.