Хорошо, во-первых, браузер должен знать местоположение файла, чтобы загрузить его. Любой, кто откроет стандартный инструмент разработки браузера, такой как Firebug, сможет увидеть в текстовом виде URL-адрес вашего файла.
Теперь, я полагаю, вы хотите защитить свой файл от несанкционированной загрузки. Если это то, что вы хотите, есть способ использовать сеанс.
На первой странице вы разместите свой код, чтобы проверить, разрешена ли загрузка. Затем вы включите текущую сессию с чем-то, что идентифицирует файл Все, что является уникальным для файла, будет делать, например, идентификатор базы данных.
$_SESSION['download_key'] = time();
Затем вы перенаправляете на страницу с html-мета как это
<meta http-equiv="refresh" content="5;/download.php?file=download_key" />
На этой странице вы скажете: «Спасибо, парень, что скачали мой потрясающий файл». Обратите внимание, что вы также можете поместить содержимое атрибута «content» в заголовочный файл, если хотите, например,
header('Refresh: 5;/download.php?file=download_key');
Обратите внимание, что 5 - это число секунд до появления диалогового окна загрузки файла.
Затем на download.php вы сделаете следующее:
1- Проверьте, какой файл был запрошен, используя $ _GET ['file'].
2- Затем вы проверяете, существует ли в сеансе ключ download_key. Если нет, то вы выходите из сценария вот так
if (!isset($_SESSION['download_key'])) die('Unauthorized');
3- Затем вы проверяете, старше ли отметки времени, чем произвольный лимит времени. Здесь с 30 сек
if ($_SESSION['download_key'] - time() > 30) die('Unauthorized');
4- Наконец, если все проверено, вы отправляете файл вот так
header('Content-disposition: attachment; filename=myfile.ext');
header('Content-type: bin/x-file-type'); //Change for the correct mimetype
readfile('myfile.ext');
После чтения файла вы поместите код для установки загрузки в базу данных равной 1.
И это все, защищенная загрузка файлов, и любой, кто использует URL-адрес напрямую, будет встречен большим «неавторизованным» текстом.
Я также хотел бы добавить, что если у вас большой файл (скажем, несколько килобайт), вам лучше отключить буферизацию вывода, так как это будет означать, что php будет хранить копию файла в памяти на весь срок загрузки. С функцией readfile php отправит его в браузер, когда он читает его на диске, и, следовательно, будет использовать меньше памяти (и начнет отправлять данные раньше).
РЕДАКТИРОВАТЬ: Что заставляет его работать следующее
Я фактически перевернул последовательность: посетитель сначала перенаправляется на страницу благодарности, которая содержит заголовок / тег Обновить. Волшебство заголовка Refresh заключается в том, что он перенаправляет ПОСЛЕ загрузки контента. На странице благодарности браузер, увидев этот заголовок, затем ждет указанное время, пока показывает страницу, , а затем перенаправляют на загрузку. После перенаправления браузер видит, что это файл для загрузки, и вместо изменения страницы просто показывает диалог загрузки файла. Как только пользователь нажмет OK, загрузка начнется, но он останется на той же странице.
Короче говоря, вам не нужно перенаправлять после загрузки файла, поскольку вы уже находитесь на странице благодарности! Я не думаю, что это даже возможно перенаправить после загрузки файла. Просто посмотрите, что происходит, когда вы нажимаете на ссылку, которая указывает на прямой файл на веб-сервере. Браузер запрашивает загрузку, но не отключает вашу навигацию. Как только загрузка начнется, вы можете счастливо щелкнуть мышью на странице со ссылкой. К тому времени, когда загрузка закончится, вы можете быть на совершенно другом веб-сайте. Вот почему вы можете только показать страницу благодарности раньше. Но если вы установите ноль для заголовка / тега обновления, приглашение на загрузку появится, как только страница загрузится, так что это почти так, как если бы они были одновременными (на взгляд посетителя)