PHP: Otwieranie zdalnych plików
Każdy z Was na pewno korzystał kiedyś z funkcji fopen w php. Zazwyczaj korzystamy z niej, aby otworzyć pliki znajdujące się na tym samym serwerze, na którym uruchamiamy skrypt. Co zrobić, gdy chcemy otworzyć zdalny plik? Korzystanie z protokołu http nie jest tutaj dobry rozwiązaniem. Niektórych plików nie można przezeń otworzyć, a na pewno nie poradzi sobie z tym protokołem funkcja filesize, służąca do określania rozamiaru pliku. Skorzystamy więc z protokołu ftp!
Protokół ftp
Jest on znany wszystkim osobom mającym styczność ze stronami internetowymi. Oferuje możliwość zalogowania się na konto na serwerze i uzyskania pełnego dostępu do plików znajdujących się na tymże serwerze. Jak otworzyć plik korzystając z połączenia ftp? Wcale nie musimy korzystać z całego zestawu funkcji dostępnych w języki php zaczynających się od ftp_. Wystarczy nam funkcja fopen i ew. filesize (jeśli zamierzamy udostępnić plik do pobrania).
Wszystkie dane potrzebne do połączenia zawrzemy w adresie, który przekażemy funkcji fopen jako parametr. Adres taki ma następującą składnię:
ftp://użytkownik:hasło@host:port/ścieżka
Np. jeśli potrzebujemy połączyć się z hostem kacperkolodziej.com na porcie 43, a do zalogowania użyjem użytkownika kacper i hasła password, to nasz adres url będzie wygladał tak:
ftp://kacper:password@kacperkolodziej.com:43/
Oczywiście musimy jeszcze podać ścieżkę do pliku. Załóżmy, że w katalogu files na serwerze mamy plik dane.txt. Aby go otworzyć wpisujemy następującą ścieżkę:
ftp://kacper:password@kacperkolodziej.com:43/files/dane.txt
I już. Takiego adresu możemy użyć jako parametr zarówno funkcji fopen jak i filesize i wszystkich innych służących do obsługi plików.
Skrypt downloadu
Na koniec prezentuję mały skrypt służący do downloadu ze zdalnego serwera. Kod w listingDump.
Za pomocą funkcji fassthru przekazujemy całą zawartość pliku do przeglądarki. Odpowiednio ustawione nagłówki pozwalają na poinformowanie przeglądarki jaki jest to typ pliku, jaki ma rozmiar i co najistotniejsze w tym skrypcie, pod jaką nazwą ma być wysłany plik do użytkownika. To jest właśnie jedna z przewag takiego rozwiążania, zamiast przekierowywania użytkownika funkcją header do pliku. Drugą z zalet jest to, że w tym skrypcie możemy "nakazać" poinformowanie nas o pobraniu pliku.