Jak wymusić pobranie pliku przez przeglądarkę



Czasem zachodzi potrzeba aby plik (nawet tekstowy) został zapisany na dysk, a nie otwarty przez przeglądarkę. Rozwiązanie jest bardzo proste. Wystarczy poinformować o tym fakcie przeglądarkę wysyłając nagłówek Content-Disposition: attachment.

Sposób pierwszy - plik .htaccess

<Files pliktekstowy.txt>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>


Nagłówki można doklejać do wszystkich plików określonego typu, np.:

<Files *.pdf>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>


W tym przypadku wszystkie pliki z rozszeżeniem pdf nie będą otwierane przez przeglądarkę, tylko zostanie wymuszone zapisanie na dysk lub uruchomienie w readerze.
Reguła działa w katalogu w którym jest plik .htaccess oraz wszystkich podkatalogach.

Jeżeli reguła nie zadziała (błąd 500) prawdopodobnie Twój apache ma wyłączony moduł do nagłówków. Włącz go:

LoadModule headers_module modules/mod_headers.so

Sposób drugi - PHP


Ta metoda jest idealna w przypadkach, gdy musimy dołączyć dodatkową logikę związaną z obsługą plików. Np. Pobieranie tylko dla zalogowanych.

Najprościej rzecz ujmując:
 

<?php
$file_to_download = 'pliktekstowy.txt';

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . $file_to_download);

readfile($file_to_download);


Wersja dla dokładniejszych (z dokładnym mime typem oraz długością pliku):
 

<?php
$file_to_download = 'pliktekstowy.txt';

header("Content-Type: " . mime_content_type($file_to_download));
header("Content-Length: " . filesize($file_to_download));
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=" . basename($file_to_download));

readfile($file_to_download);


 



Proszę czekać...
Nie możesz komentować. Bartosz Stasiurka umieścił Cię na czarnej liście lub Twoje konto nie jest aktywne.

zamknij

zgłoś nadużycie

Zgłoszenie zostało zapisane.

Wystąpił błąd. Spróbuj ponownie później.

Zamknij

Dodaj do listy zablokowanych

Czy na pewno chcesz zablokować tego użytkownika?

 


zamknij

Logowanie

Jeżeli nie chcesz zakładać bloga, a jedynie brać udział w dyskusjach załóż konto podstawowe.

zamknij