Веб-разработка, логотип Eqsash

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

Оставить заявку

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

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