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.