Strony internetowe oprócz prezentowania rozmaitych treści często udostępniają swoje zasoby do pobrania. Jeżeli również chciałbyś umożliwić internautom pobieranie pewnych dokumentów, grafik, programów i wielu innych zasobów, z tego tekstu dowiesz się jak to zrobić.
Rozwiązanie jest bardzo proste, a do tego pozwala też ukryć rzeczywistą lokalizację plików. Przypuśćmy, że plik mapa.jpg znajduje się w katalogu tajne-dane. Jeżeli w jakimś miejscu na stronie umieścimy link:
<a href="tajne-dane/mapa.jpg">mapa.jpg</a> |
to zdradzimy tajną lokalizację.
Natomiast link do dokumentu html lub skryptu php otworzy stronę lub uruchomi skrypt na serwerze. Wprawdzie w zdecydowanej większości tak właśnie powinno być, ale czasem potrzebujemy niestandardowych działań.
Rozwiązanie powyższych i wielu innych podobnych problemów sprowadza się do wysłania odpowiednich nagłówków do przeglądarki. Link umieszczony na stronie prowadzi do skryptu, który pozwala na pobranie innego pliku nawet z zupełnie innej lokalizacji. Skrypt możemy zapisać w katalogu głównym serwisu w pliku o nazwie mapa.php
<?php $file='tajne-dane/mapa.jpg'; header('Content-disposition: attachment; filename='.basename($file)); header('Content-type: image/jpeg'); readfile($file); ?> |
Chcemy udostępnić internautom do pobrania skrypt: jak-to-zrobilem.php? Tworzymy plik skrypt.php, a w nim:>
<?php $file='jak-to-zrobilem.php'; header('Content-disposition: attachment; filename='.basename($file)); header('Content-type: text/plain'); readfile($file); ?> |
Teraz należy Ci się kilka słów wyjaśnienia. W pierwszej linii podstawiam do zmiennej $file nazwę pliku wraz ze ścieżką. Ścieżka nie będzie dla nikogo widoczna, więc nie zdradzamy lokalizacji tego pliku. Następna linia wysyła nagłówek z informacją o przesyłanym załączniku i jego nazwie. Zauważ, że zmienna $file jest przekazywana przez funkcję basename(), która zwraca samą nazwę pliku bez ścieżki dostępu. Trzecia linia wysyła informację o typie MIME załącznika. Najpopularniejsze typy MIME umieszczam nieco niżej. Ostatnia linia przy pomocy funkcji readfile() wczytuje wskazany plik.
Pamiętaj aby nie wyświetlać niczego w tym skrypcie. Sprawdź czy poza blokiem kodu PHP nie znajdują się żadne białe znaki.
Popularne typy MIME
- pliki specyficzne dla programów
application/javascript
– JavaScriptapplication/xhtml+xml
– XHTMLapplication/x-shockwave-flash
– pliki Adobe Flashapplication/json
– Notacja Obiektowa JavaScript JSON
- pliki audio
audio/mpeg
– MP3 lub inny MPEG audioaudio/x-ms-wma
– Windows Media Audioaudio/vnd.rn-realaudio
– RealAudioaudio/x-wav
– WAV
- pliki z grafiką
image/gif
– Obraz GIFimage/jpeg
– Obraz JPEGimage/png
– Obraz PNGimage/tiff
– Obraz TIFFimage/vnd.microsoft.icon
– Obraz ICO
- tekst zrozumiały dla ludzi lub kod źródłowy
text/css
– Cascading Style Sheets (pliki styli css)text/html
– HTMLtext/plain
– Dane tekstowetext/xml
– eXtensible Markup Language
- pliki wideo
video/mpeg
– MPEG-1 wideo z multiplexed audiovideo/mp4
– MP4 wideovideo/quicktime
– QuickTime wideovideo/x-ms-wmv
– Windows Media Video