Generowanie pobierania pliku

Na wielu witrynach, szczególnie na tych z plikami do pobrania, a także na moim blogu, można zauważyć, że do plików dodawany jest adres strony lub jej nazwa. Najczęściej wygląda to w ten sposób: plik(adres.pl).zip. W tym wpisie pokażę jak to zrobić.

Rozwiązanie jest bardzo proste. Na początku stwórzmy plik o nazwie pobierz.php:

<?php
if(!empty($_GET['src'])) { 
    $file = str_replace('..','',$_GET['src']); 
    $cat_with_file = 'programy';
    $local_file = $cat_with_file.'/'.$file;
    $info = pathinfo($file);
    $download_file = $info['filename'].'(blog.klocus.pl).'.$info['extension'];
 
    if(file_exists($local_file) && is_file($local_file))
    {
        //Otwarcie pliku
        $fp = fopen($local_file, 'rb');
 
        //Wysłanie informacji o pliku do przeglądarki
        header('Content-Type: application/octet-stream'); //Typ
        header('Content-Length: ' .filesize($local_file)); //Rozmiar
        header('Content-Disposition: filename='.$download_file); //Nazwa
 
        //Zrzucanie pliku i zatrzymanie skryptu
        fpassthru($fp);
        exit;
    }
    else die("ERROR: Plik ".$file." nie istnieje!");
}
else header('Location: http://blog.klocus.pl');
?>

Teraz załóżmy, że powyższy skrypt znajduje się na serwerze i chcemy pobrać plik paczka.zip, który znajduje się w folderze programy wraz z innymi plikami. Wklepujemy zatem następujący adres w pasek przeglądarki: www.adres.pl/pobierz.php?src=paczka.zip. Powinno ukazać się okienko pobierania, ale co stało się podczas wywołania skryptu?

Po pierwsze, sprawdziliśmy, czy do elementu src tablicy $_GET została przypisana jakaś wartość. Nie chcemy przecież, by ktoś przeglądał sam plik pobierz.php, w którym nic mu się nie wyświetli, dlatego też, gdy src będzie puste, przekierowujemy na naszą stronę.

W następnej linijce definiujemy nazwę pliku. Aby się zabezpieczyć przed możliwością pobrania innych plików, z poza katalogu (katalog zdefiniowałem w zmiennej $cat_with_file), usuwamy dwie kropki (o ile wystąpiły) przez funkcję str_replace(). Uniemożliwi to takiemu działaniu: www.adres.pl/pobierz.php?src=../../index.php

Kolejną linijką, która nas najbardziej interesuje, jest linijka siódma. W niej generujemy nową nazwę pliku, która będzie zawierała adres naszej strony. Aby to zrobić zastosowałem funkcję pathinfo(), która pozwoliła mi rozłożyć plik na dwa kawałki: nazwę oraz rozszerzenie.

Ostatnim zadaniem skryptu jest sprawdzenie czy taki plik istnieje. Jeżeli tak, to otwieramy go za pomocą funkcji fopen() i wysyłamy nagłówki do przeglądarki (header) z informacją o tym, iż generowana treść będzie plikiem.

Powiązane Wpisy

guestbook

Prosta księga gości na ...

php

Jak pobrać rozszerzenie ...

Top Facebook Shared...

Komentarze

  1. eRIZ dnia 27 maja 2013 o 10:28 napisał(a):

    Hint: basename.

  2. BARTIK122 dnia 5 czerwca 2013 o 13:05 napisał(a):

    Może dodał byś coś takiego aby można było wchodzić do podkatalogów takim sposobem ?
    Np. zamiast http://www.twojastrona.pl/modules/header/index.php
    to np. http://www.twojastrona.pl/modul?header

    Byłbym wdzięczny 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *