Как скрыть URL скачиваемого файла на PHP
Вы, наверняка, встречали сайты, где Вы пытались скачать какой-то файл, однако, прямой URL к нему Вы не получали. Была какая-то временная ссылка, уникальная только для Вас, файл нормально скачивался, но прямую ссылку никто не раскрывал. В этой статье мы с Вами разберём, как скрыть URL скачиваемого файла на PHP.
Сразу приступим к коду:
<?php
function download($filename) {
if (file_exists($filename)) {
/* Если файл существует */
header("Content-Disposition: attachment; filename='" . basename($filename) . "';"); // Указываем имя при сохранении в браузере
echo file_get_contents($filename); // Отдаём файл пользователю на скачивание
}
else echo "Not Found"; // Если файла не существует
}
download("book.pdf");
?>
Если обратиться к этому скрипту, то начнётся скачивание файла book.pdf, однако, ни названия файла, ни директории, в которой лежит файл, пользователь не увидит, если Вы этого сами не захотите.
Какие открываются возможности, если использовать такое скрытие URL скачиваемого файла? Во-первых, никто не знает прямых ссылок, а это позволяет Вам перед скачиванием прокрутить рекламу. Это защищает от ботов, которые пытаются выкачать Ваш сайт целиком. Это позволяет вести статистику количества скачиваний файлов. Это позволяет запретить отдельным пользователям скачивание и так далее.
Как видите, возможностей очень много, а в основе лежит этот простенький скрипт на PHP.
-
- Михаил Русаков
Комментарии (13):
Что-то я не совсем понял работу этого скрипта. Если я засуну его в определенную страницу, например на страницу после оплаты, то при загрузке страницы откроется окно для скачивания этого файла. После сохранения файла. пойдет загрузка. Но человек сможет взять и скопировать адрес к этой странице и отдать другу - и все, материал в сети! Смысл тогда от этого кода то?
Ответить
Так сделайте временную ссылку. В скрипте проверяется ссылка, и если она ещё действительна, то надо вызвать функцию download().
Ответить
Для меня это сейчас лес =)
Ответить
http://myrusakov.ru/php-how-study.html
Ответить
Спасибо большое! =)Буду учить все! =)
Ответить
Хочу сказать большое Вам спасибо за то, что правильно направили! =) Теперь правильно буду изучать PHP, ато в книгах очень много сказано, а я не понимаю. =( Думаю скоро приобрету Ваш видеокурс по PHP и MySQL, чтобы уж точно вооружится знаниями.
Ответить
чета за место файла скачивает htm страницу. Что не так <? $filename = $_GET['file']; function download($dir, $filename) { if(file_exists('./uploads/'.$dir.'/'.$filename)) { /* Если файл существует */ header("Content-Disposition: attachment; filename='" . basename($filename) . "';"); // Указываем имя при сохранении в браузере echo file_get_contents('./uploads/'.$dir.'/'.$filename); // Отдаём файл пользователю на скачивание }else echo "Not Found"; // Если файла не существует } download('price', $filename); ?>
Ответить
http://myrusakov.ru/php-finderror.html
Ответить
Чета все равно ничего не выходит. Даже оригинальный вариант тоже htm скачивает
Ответить
Убедитесь, что формат файла php и запускаете его правильно: http://myrusakov.ru/php-start.html
Ответить
вот и ошибка надо добавить header('Content-Description: File Transfer'); header('Content-Type: application/force-download'); мой вариант function download($dir, $filename) { $filename = "./uploads/".$dir."/".$_GET['file']; // $_GET['file'] - имя файла передаваемое по ссылке вида http://site.ru/download.php?file=файл if(file_exists($filename)) { header('Content-Description: File Transfer'); header('Content-Type: application/force-download'); header('Content-Length: ' . filesize($filename)); header('Content-Disposition: attachment; filename=' . basename($filename)); readfile($filename); }else echo "Not Found"; } download('price', $filename); // price папка где находится файл
Ответить
Здравствуйте Михаил. Подскажите пожалуйста как можно реализовать такой вариант: есть страница test.php.. ни в строке браузера, ни в исходном коде её нельзя будет увидеть.. в строке к примеру должен быть такой вид 0f2d5s4f52g55... время жизни 10 сек., при перезагрузке после 10 сек. пустое окно без редиректа на 404...Т.е. временная, динамическая ссылка на страницу. Подскажите пожалуйста. Спасибо.
Ответить
Здравствуйте, Алекс_Н! 1. в строке урл при шифровании укажите конец жизни ссылки (проблема: синхронизация + загруженность сервера = может возникнуть ситуация когда урл расшифруется, а время уже больше 10 секунд) 2. сохранить вид 0f2d5s4f52g55... и как только запрос поступит вывести инфу и удалить 0f2d5s4f52g55...
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.