PHP: собираем ссылки на картинки рекурсивно
Построить на PHP рекурсивное дерево папок сервера легко. Намного ли усложняется задача, если нужно собрать из вложенных папок и вывести в браузер (или ещё куда-то) определённые типы файлов, например, наши любимые картинки, на которые мы хотим сослаться и куда-то вставить их адреса?
Так как браузеры уже умеют копировать ссылки на изображения, нам достаточно получить на PHP рекурсивный список файлов из нужной папки и вывести их на страницу.
Показанное ниже решение подойдёт только для относительно небольших объёмов и линейных размеров картинок, например, для вашей коллекции смайликов или иконок. Так как скрипт для рекурсивного сбора и отображения картинок будет рекурсивно лазить по папкам, так и назовём его - "Папкун" :)
Представим, что у нас есть папка со скриптом на хосте и несколько вложенных папок, возможно, тоже содержащих картинки:
фрагмент дерева папок локального хоста
При этом, среди файлов есть "посторонние", одна папка (с именем 1
) пуста, а папка img
содержит ещё 2 вложенных.
Для решения задачи можно использовать функцию glob, обернув её в функцию, модифицирующую нужный шаблон поиска файлов, например, так:
<?php function rglob($pattern, $flags = 0) { $files = glob($pattern, $flags); foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { $files = array_merge($files, rglob($dir.'/'.basename($pattern), $flags)); } return $files; } $cdir = rglob ("./*.{jpg,png,gif}",GLOB_BRACE); //эта маска - не регулярка! foreach ($cdir as $value) { $alt = str_replace("\\",'/',"http://".$_SERVER['HTTP_HOST']. substr(getcwd(),strlen($_SERVER['DOCUMENT_ROOT']))).ltrim($value,'.'); //всплывающая на картинке подсказка - полный URL этой картинки echo "\n".'<img src="'.$alt.'" alt="'.$alt.'" title="'.$alt.'"> '; } ?>
Код показан без обрамления HTML.
Здесь мы получим и "вывалим" в браузер массив картинок указанных в маске вызова типов файлов из всех вложенных папок, начиная с папки расположения скрипта.
Ссылки на файлы делаются абсолютными и они же служат всплывающими подсказками при наведении мыши на картинку (атрибут title
тега <img>
).
вывод скрипта 1
Единственное неудобство, которое я вижу в решении - файлы представлены одним списком, без соблюдения структуры папок.
Чтобы разрешить проблему, придётся сделать чуть больше телодвижений, в частности, использовать массив массивов для сохранения информации о папках, в которых находились исходные файлы. Приведём соответствующий код, добавив к нему небольшое обрамление HTML.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Papkun</title> <style type="text/css"> html, body { padding:0; margin:10px; background:#ffffff; color:#000000; } </style> </head> <body> <p> Нажмите правой кнопкой мыши на нужной картинке и скопируйте ссылку на неё. Нужный пункт меню может называться "Копировать URL картинки" (Chrome), "Копировать ссылку на изображение" (Firefox), "Копировать адрес изображения" (Safari) и т.д. Затем вставьте адрес картинки там, где можно добавлять ссылки на внешние изображения. </p> <?php function dirToArray ($dir) { $result = array(); $cdir = scandir ($dir); foreach ($cdir as $value) { if (is_dir ($dir.'/'.$value) and !preg_match("/^\..*$/",$value)) { //папка, но не начинается с точки $result[$dir.'/'.$value] = dirToArray ($dir.'/'.$value); } else if (preg_match("/^.*\.(jpg|jpeg|png|gif)$/i",$value)) { //не папка, и имя соответствует маске $result[] = $dir.'/'.$value; } } return $result; } function filesToList ($files) { $s = ''; foreach ($files as $path => $file) { if (is_array($files[$path])) //путь к папке будет заголовком $s .= "\n".'<h3>'.$path.'</h3>'.filesToList ($files[$path]); else { $alt = str_replace("\\",'/',"http://".$_SERVER['HTTP_HOST']. substr(getcwd(),strlen($_SERVER['DOCUMENT_ROOT']))).ltrim($files[$path],'.'); $s .= "\n".'<img src="'.$alt.'" alt="'.$alt.'" title="'.$alt.'"> '; } } return $s."\n"; } $files = dirToArray ('.'); asort ($files); //файлы текущей папки должны оказаться впереди echo filesToList ($files); ?> </body> </html>
вывод скрипта 2
Мне кажется, так гораздо удобнее и видно, какую пустую папку надо удалить с сервера :)
Обратите внимание, что здесь происходит всего одно обращение к серверу и не нужен JQuery или подобный AJAX. Ну а дальше можно сколько угодно усложнять себе задачу - например, сделать выбор папки из списка, подгружать данные через AJAX или из сформированного яваскриптом массива имён файлов и т.п.
Скрипты в работе: списком, по папкам, осторожно, там одна папка с иконками 18+ :)
01.03.2018, 10:56 [4418 просмотров]