БлогNot. PHP: собираем ссылки на картинки рекурсивно

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
вывод скрипта 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
вывод скрипта 2

Мне кажется, так гораздо удобнее и видно, какую пустую папку надо удалить с сервера :)

Обратите внимание, что здесь происходит всего одно обращение к серверу и не нужен JQuery или подобный AJAX. Ну а дальше можно сколько угодно усложнять себе задачу - например, сделать выбор папки из списка, подгружать данные через AJAX или из сформированного яваскриптом массива имён файлов и т.п.

Скрипты в работе: списком, по папкам, осторожно, там одна папка с иконками 18+ :)

01.03.2018, 10:56 [4241 просмотр]


теги: программирование php xxx иконка

показать комментарии (1)