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);
