Все прикладные программы уверены, что они умнее, чем их пользователи. К сожалению, обычно они правы. Но что делать, если я всё-таки считаю себя умнее, а софт отказывается это замечать?
Программы постоянно пытаются додумать за меня, что я хотел получить; исправить меня; сто раз переспросить, уверен ли я, что хочу сделать то, что приказываю ей. Это - наследие древнего бюрократического мышления с подписями и согласованиями каждого мельчайшего действия. Программист не доверяет пользователю, а чиновник не доверяет простолюдину - и это разумно до тех пор, пока кругом "Разруха в головах". Но как же быть Профессору Преображенскому, когда Швондер ставит его в один ряд со всем поколением Шариковых?
Браузеры полюбили по умолчанию воспроизводить MP3 и открывать PDF внутри себя. А что мне сделать, если я знаю, что человек пришёл на страницу, чтобы скачать файл, и хочу позволить ему сделать это в один клик?
Задача
Принудительно отправить файл на скачивание, даже если браузер искренне желает открыть его самостоятельно.
Решение:
Их как минимум два.
Первое - отправить нужные HTTP-заголовки с помощью PHP.
Минусы:
- ресурсоёмкость;
- потенциальная дыра в безопасности (если не поставить ограничений, злоумышленник при желании сможет скачать любой файл с сервера - даже php-скрипт);
Плюс:
- один и тот же файл в разных случаях можно как скачивать, так и открывать в браузере.
Создаём файл download.php ледующего содержания:
download.php
$file = isset($_GET['file']) ? trim($_GET['file']) : '';
if (empty($file) || !file_exists($file))
die('File not found');
header('Content-Type: application/octet-stream');
header('Content-Disposition: filename="'.end(explode('/', $file)).'"');
header('Content-length: '.filesize($file));
header('Cache-Control: no-cache');
readfile($file);
Теперь скачать файл sound.mp3 можно, обратившись к скрипту: download.php?file=sound.mp3
Второе - использовать файл .htaccess.
Его нужно разместить в директории, содержащей файлы. В нём надо написать единственную строчку:
AddType application/file .mp3 .wav .ogg .pdf
#можно заменить application/file на application/octet-stream
теперь для mp3, wav, ogg и pdf-файлов в этой папке сервер всегда будет отправлять HTTP-header'ы, вызывающие скачивание файла.
Такой же трюк можно провернуть и для .html, .txt, и вообще, любых типов файлов.