Wpisy otagowane ‘nagłówki HTTP’

Jak pobrać plik

czwartek, 8 Wrzesień 2011

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 – JavaScript
    • application/xhtml+xml – XHTML
    • application/x-shockwave-flash – pliki Adobe Flash
    • application/json – Notacja Obiektowa JavaScript JSON
  • pliki audio
    • audio/mpeg – MP3 lub inny MPEG audio
    • audio/x-ms-wma – Windows Media Audio
    • audio/vnd.rn-realaudio – RealAudio
    • audio/x-wav – WAV
  • pliki z grafiką
    • image/gif – Obraz GIF
    • image/jpeg – Obraz JPEG
    • image/png – Obraz PNG
    • image/tiff – Obraz TIFF
    • image/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 – HTML
    • text/plain – Dane tekstowe
    • text/xml – eXtensible Markup Language
  • pliki wideo
    • video/mpeg – MPEG-1 wideo z multiplexed audio
    • video/mp4 – MP4 wideo
    • video/quicktime – QuickTime wideo
    • video/x-ms-wmv – Windows Media Video