Я хочу вынести ее из публичной папки.Зачем? Есть какая-то особенная необходимость? По логике все файлы сайта должны находиться в одной папке проекта, а файлы видимые из веба в публичной папке проекта. В некоторых случаях, например когда эти файлы не должны отдаваться без какого-то уровня доступа, их выносят выше публичной папки, таким образом закрывая от прямого доступа из веб. Далее доступ осуществляется через пхп, конкретная реализация сильно зависит от задач и имеющегося кода/фреймворка. Простейший вариант - имя файла читается как параметр из урл, далее делается readfile() из этой папки с файлами, предварительно отдаются заголовки, указывающие что это файл изображения. Хотя без понимания "зачем" реализация "как" это тыканье пальцем в небо. Может вам симлинк тупо подойдет...
В идеале - в любое место на диске, которое захочу.Так делать не нужно. Это во первых нарушает безопасность, так как вы даете права на чтение из веба в папку, которая не должна быть доступной левым пользователям, во вторых распыляет проект по машине, что тоже не есть хорошо как минимум в плане организации.
<Directory /var/www/html>
Options +Indexes
AllowOverride None
Require all granted
</Directory>
foreach (scandir('.') as $file)
{
if ($file == '.' || $file == '..') continue;
echo '<a href="' . htmlspecialchars($file) . '">' . htmlspecialchars($file) . '</a> - ' . filesize($file) . '<br>';
}
index.php
в папке public
в котором будут выводиться изображения: <?php
require __DIR__ . '/functions.php';
$images = getAllImages();
<?php
foreach ($images as $image) {
$imageLink = __DIR__ . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . $image ;
echo '<div><img src="' . $imageLink . '" alt="' . $image. '"></div>';
}
functions.php
в папке public
:/**
* Функция сканирования папки в поиске изображений
*
* @param string $directory
* @return array
*/
function getAllImages(string $directory = __DIR__ . '/images/'): array
{
$images = [];
$ignoreFiles = ['.', '..',];
$files = scandir($directory);
foreach ($files as $file) {
if (in_array($file, $ignoreFiles)) {
continue;
}
$images[] = $file;
}
return $images;
}
images
, которая находится в папке public