Вход Регистрация
ruen

Контроль файлов на PHP - как запретить скачивание и сделать счетчик загрузок

php-contol-file

Управлять файлами на 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. Можно легко осуществить запрет скачивания файлов или сделать счетчик загрузок.

Комментарии (0)
Для комментирования войдите или зарегистрируйтесь.
Оставить заявку

Последние статьи

Популярные разделы

Eqsash (Инструменты)

Приложение для Android - VK LAST USER ID, отучитель от зависимости и т.д.:
Доступно в Google Play

Amessage (Общение)

Вход в веб-версию
Приложение для Android:
Доступно в Google Play

Поделиться

Подписаться

YouTube

Книги

IT-заметки - Простым языком о самом нужном (HTML, CSS, JavaScript, PHP, базы данных, Drupal, Битрикс, SEO, домены, безопасность и другое), PDF, 500 стр.