Контроль файлов на PHP - как запретить скачивание и сделать счетчик загрузок
Управлять файлами на PHP достаточно просто – для этого в арсенале языка есть большое количество возможностей. Контроль за скачиванием файлов может понадобиться в самых разных ситуациях, можно сделать к примеру запрет скачивания или счетчик загрузок файлов на PHP.
Для чего это может понадобиться? Например, скачивать файлы могут только зарегистрированные пользователи или пользователи, оплатившие программное обеспечение и т.д. В таком случае необходимо сделать запрет скачивания файлов и разрешать его только тем пользователям, которые выполнили требование. Также часто может понадобится реализовать счетчик загрузок файла, который будет показывать посетителям насколько популярен тот или иной файл, а также такой счетчик можно использовать в целях мониторинга. Одним словом, вариантов для чего может понадобиться контроль за файлами на PHP - множество.
Итак, как это можно реализовать? Ниже будут рассмотрены необходимые шаги.
Подготовка папки и файлов
Для начала необходимо поместить файлы для скачивания в отдельную папку, которая желательно будет недоступна при наборе адреса в строке. Для этого при создании сайта необходимо размещать его в подпапке корневой директории и указать это в настройках хостинга, чтобы в корне можно было создавать и другие папки, недоступные из браузера. Или можно для папки со скачиваемыми файлами прописать инструкции в .htaccess, запрещающие прямой доступ к файлам.
Лучше конечно вынести такую папку выше корневой директории сайта – тогда никто не сможет напрямую получить доступ к файлу через адрес в строке браузера. Называться такая папка может как угодно, например, private-directory. Когда папка создана и файлы размещены, можно перейти к следующему шагу.
Составление формата адресов
Теперь, когда прямое скачивание файлов запрещено, нужно решить, как будут выглядеть адреса скачиваемых файлов. Адреса можно использовать любые, как с расширением на конце, так и без – они все равно будут виртуальными. Например, адреса могут выглядеть примерно следующим образом: /download/file, /download/file.jpg или /download/files/file.jpg.
Реализация функции запрета и подсчета количества скачиваний файла
Напишем функцию, осуществляющую контроль за доступом к скачиванию. Примерно она может выглядеть так:
// запуск функции управления доступом к файлу и контролем за его количеством скачиваний, может выполняться из любого места по определённым условиям
get_file();
function get_file() {
// пути к приватной директории, к скачиваемому файлу и к файлу данных
$directory_path = getcwd().'/private-directory';
$file_path = $directory_path.$_SERVER['REQUEST_URI'];
$data_path = $directory_path.'/data.ini';
// управление доступом, $is_access может быть true или false в зависимости от условия, реализуемого самостоятельно под потребности проекта
$is_access = true;
if ($is_access) {
// чтение данных о количестве загрузок, хранение данных скачиваний в обычном файле - на практике лучше хранить в базе данных
$data = file_exists($data_path) ? parse_ini_file($data_path) : array();
$data[$file_path] = isset($data[$file_path]) ? $data[$file_path] + 1 : 1;
$data_ini = '';
foreach ($data as $key => $value) {
$data_ini .= $key.' = '.$value.PHP_EOL;
}
file_put_contents($data_path, $data_ini);
// запуск скачивания файла
download_file($file_path);
} else {
echo 'Нет доступа';
}
}
Написание функции для скачивания файла через PHP
Наконец, реализуем саму функцию download_file для скачивания файла. В самом простом виде она может выглядеть как показано ниже, она принимает на вход один параметр – путь к файлу:
function download_file($file_path) {
// очистка буферизации, если она была включена
if (ob_get_level()) {
ob_end_clean();
}
// проверка существования файла
if (file_exists($file_path)) {
// формирование заголовков, необходимых для скачивания файла
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file_path));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file_path));
// чтение файла и отдача его на загрузку
readfile($file_path);
} else {
echo 'Файл не найден';
}
die();
}
Таким образом, в статье была рассмотрена тема управления доступом к файлам на PHP. Можно легко осуществить запрет скачивания файлов или сделать счетчик загрузок.
Последние статьи
- 03.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 3. Все операторы PHP с примерами, с выводом работы кода на экран.
- 02.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 2. Типы данных в PHP с примерами.
- 02.04.24ИТ / Уроки PHP Уроки простыми словами. Урок 1. Коротко о языке веб-программирования PHP. Основы синтаксиса.
- 09.11.23ИТ / Базы данных Ошибки при переходе с MySQL 5.6 на 5.7 и как их исправить - импорт дампа БД завершился ошибкой или не работает INSERT. Отключение строгого режима STRICT_TRANS_TABLES или использование IGNORE
- 08.07.22ИТ / Разное Конвертация офисных файлов DOC, DOCX, DOCM, RTF в форматы DOCX, DOCM, DOC, RTF, PDF, HTML, XML, TXT без потерь и изменения разметки