Выпадающий список с файлами на хостинге

Примеры как сделать <select> для выбора загруженных файлов. Из PHP-функций для работы с файловой системой – opendir(), scandir(), glod(), лучше всех подходит scandir() т.к. сразу возвращает отсортированный массив с именами файлов и директорий.

В примерах используется следующая структура файлов:

uploads/
├── .htaccess
├── files/
│   ├── images/
│       ├── controls.png
│       ├── loader.gif
│   ├── ru.html
│   ├── Новый текстовый документ.txt
├── index.jpg
├── marker.png
├── menu.png
├── reviews.png
├── robots.txt
├── Фонды.rtf

Самый не сложный вариант выведет список всех файлов в одной директории.

<?php
$path = __DIR__ . '/uploads';
?>
 
<select name="file" class="form-control">
	<option value=""></option>
	<?php 
	foreach(scandir($path) as $obj) {
		if ($obj == '.' || $obj == '..') {
			continue;
		} elseif (!is_dir($path . '/' . $obj)) {
			echo '<option value="/' . $obj . '">' . $obj . '</option>';
		}		
	} 
	?>
</select>
HTML

Результат:

<select name="file" class="form-control">
	<option value=""></option>
	<option value="/.htaccess">.htaccess</option>
	<option value="/index.jpg">index.jpg</option>
	<option value="/marker.png">marker.png</option>
	<option value="/menu.png">menu.png</option>
	<option value="/reviews.png">reviews.png</option>
	<option value="/robots.txt">robots.txt</option>
	<option value="/Фонды.rtf">Фонды.rtf</option>
</select>

Второй вариант с фильтром по расширению файлов (jpg, png, gif):

<?php
$path = __DIR__ . '/uploads';
$filter = array('jpg', 'png', 'gif');
?>
 
<select name="file" class="form-control">
	<option value=""></option>
	<?php 
	foreach(scandir($path) as $obj) {
		if ($obj == '.' || $obj == '..') {
			continue;
		} elseif (!is_dir($path . '/' . $obj)) {
			$ext = mb_strtolower(mb_substr(mb_strrchr($obj, '.'), 1));
			if (in_array($ext, $filter)) {
				echo '<option value="/' . $obj . '">' . $obj . '</option>';
			}
		}		
	} 
	?>
</select>
HTML

Для селекта со списком всех файлов, включая подкатегории, понадобится рекурсивная функция.

Вывод названий категорий сделан в заблокированном <option> т.к. <optgroup> не может быть вложен друг в друга.

<?php
function tree_options($path, $_livel = 0, $_base = '')
{
	if ($_livel == 0) {
		$_base = $path;
	}

	$out = '';
	$tab = implode('', array_fill(0, $_livel, '&nbsp;&nbsp;&nbsp;'));

	$objs = scandir($path);
	foreach($objs as $obj) {
		if ($obj == '.' || $obj == '..') {
			continue;
		} elseif (is_dir($path . '/' . $obj)) {
			$out .= '<option disabled>' . $tab . $obj .'</option>';
			$out .= tree_options($path . '/' . $obj, ++$_livel, $_base);
		} else {
			$out .= '<option value="' . str_replace($_base, '', $path . '/' . $obj) . '">' . $tab . $obj . '</option>';
		}
	}

	return $out;
}
?>

<select name="file" class="form-control">
	<option value=""></option>
	<?php echo tree_options(__DIR__ . '/uploads'); ?>
</select>
HTML

Результат:

<select name="file" class="form-control">
	<option value=""></option>
	<option value="/.htaccess">.htaccess</option>
	<option disabled>files</option>
	<option disabled>&nbsp;&nbsp;&nbsp;images</option>
	<option value="/files/images/controls.png">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls.png</option>
	<option value="/files/images/loader.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader.gif</option>
	<option value="/files/ru.html">&nbsp;&nbsp;&nbsp;ru.html</option>
	<option value="/files/Новый текстовый документ.txt">&nbsp;&nbsp;&nbsp;Новый текстовый документ.txt</option>
	<option value="/index.jpg">index.jpg</option>
	<option value="/marker.png">marker.png</option>
	<option value="/menu.png">menu.png</option>
	<option value="/reviews.png">reviews.png</option>
	<option value="/robots.txt">robots.txt</option>
	<option value="/Фонды.rtf">Фонды.rtf</option>
</select>

С фильтром

<?php
function tree_options($path, $filter, $_livel = 0, $_base = '')
{
	if ($_livel == 0) {
		$_base = $path;
	}

	$out = '';
	$tab = implode('', array_fill(0, $_livel, '&nbsp;&nbsp;&nbsp;'));

	$objs = scandir($path);
	foreach($objs as $obj) {
		if ($obj == '.' || $obj == '..') {
			continue;
		} elseif (is_dir($path . '/' . $obj)) {
			$out .= '<option disabled>' . $tab . $obj .'</option>';
			$out .= tree_options($path . '/' . $obj, $filter, ++$_livel, $_base);
		} else {
			$ext = mb_strtolower(mb_substr(mb_strrchr($obj, '.'), 1));
			if (in_array($ext, $filter)) {
				$out .= '<option value="' . str_replace($_base, '', $path . '/' . $obj) . '">' . $tab . $obj . '</option>';
			}
		}
	}

	return $out;
}
?>

<select name="file" class="form-control">
	<option value=""></option>
	<?php echo tree_options(__DIR__ . '/uploads', array('jpg', 'png', 'gif')); ?>
</select>
HTML

Результат:

В целях безопасности не стоит выводить полные пути файлов на сервере, а так-же нужно проверять поступившие данные из форм.

06.02.2020
3137

Комментарии

, чтобы добавить комментарий.

Другие публикации

Сохранить все изображения со страницы сайта
Скрипт парсит все изображения из тега со страницы сайта, сохраняя структуру директорий и имена файлов.
9853
+2
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
45160
+17
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
37986
+13
Включить выполнение PHP кода в .html файлах
На многих хостингах по умолчанию отключено выполнение PHP скриптов в файлах .html, .htm, .tpl. Чтобы это исправить...
13300
+1
Управление доступом к файлам
Действие файла .htaccess распространяется на директорию и подкатегории в котором он размещен.
4160
0
ZIP в PHP (ZipArchive)
Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.
10058
+4