В Laravel, как получить список всех файлов в публичной папке?
Я хотел бы автоматически создать список всех изображений в своей публичной папке, но не могу найти подходящий объект для этой задачи.
Класс Storage
кажется неплохим кандидатом для этого, но он позволяет искать файлы только в папке хранения, которая находится вне публичной папки.
5 ответ(ов)
Вы можете создать дополнительный диск для класса Storage. На мой взгляд, это будет лучшее решение для вас.
В config/filesystems.php в массиве дисков добавьте желаемую папку, в данном случае это будет папка public.
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path() . '/app',
],
'public' => [
'driver' => 'local',
'root' => public_path(),
],
's3' => '....'
];
После этого вы сможете использовать класс Storage для работы с файлом в вашей публичной папке следующим образом:
$exists = Storage::disk('public')->exists('file.jpg');
Переменная $exists сообщит вам, существует ли file.jpg в папке public, потому что Storage диск 'public' указывает на публичную папку проекта.
Вы можете использовать все методы Storage из документации с вашим кастомным диском. Просто добавьте часть disk('public').
Storage::disk('public')-> // любой метод, который вам нужен из
http://laravel.com/docs/5.0/filesystem#basic-usage
Позднее редактирование:
Некоторые люди жаловались, что мой ответ не предоставляет точный метод для перечисления файлов, но моя первоначальная цель заключалась не в том, чтобы просто вставить строку кода, которую автор вопроса мог бы скопировать и вставить в свой проект. Я хотел «научить» его, если можно так выразиться, как использовать хранение Laravel, а не просто добавить какой-то код.
Тем не менее, фактические методы для перечисления файлов следующие:
$files = Storage::disk('public')->files($directory);
// Рекурсивно...
$files = Storage::disk('public')->allFiles($directory);
А часть конфигурации и предыстория приведены выше в моем оригинальном ответе.
Для получения списка файлов из локального диска в Laravel, вы можете использовать метод files
, который возвращает массив файлов из указанной директории. Если вы хотите получить только файлы определенного типа, например, только .png
, можно воспользоваться функцией array_filter()
для фильтрации результатов. Вот пример кода:
// Получаем все файлы из директории 'optional_dir_name'
$files = Storage::disk('local')->files('optional_dir_name');
// Фильтруем только PNG файлы
$pngFiles = array_filter($files, function ($item) {
return strpos($item, '.png') !== false; // Используем строгое сравнение с !== для проверки наличия '.png'
});
Обратите внимание, что метод files()
возвращает только файлы в указанной директории, а метод allfiles()
рекурсивно возвращает все файлы и подпапки. Если вам нужно искать файлы в подкаталогах, используйте allfiles()
таким образом:
// Получаем все файлы рекурсивно
$allFiles = Storage::disk('local')->allFiles('optional_dir_name');
// Фильтруем только PNG файлы
$pngFiles = array_filter($allFiles, function ($item) {
return strpos($item, '.png') !== false;
});
Это обеспечит вам массив только с .png
файлами из указанной директории и всех её подпапок.
Чтобы получить публичный путь к директории, воспользуйтесь пространством имен File
. Затем вы можете использовать приведенный ниже код для получения всех файлов из выбранной директории.
use File;
Например, если ваша публичная директория называется "media", вы можете сделать следующее:
$mediaPath = public_path('media');
$filesInFolder = File::allFiles($mediaPath);
$allMedia = [];
foreach ($filesInFolder as $path) {
$files = pathinfo($path);
$allMedia[] = $files['basename'];
}
В этом примере мы получаем путь к директории "media", затем получаем все файлы в этой директории и добавляем их имена в массив $allMedia
. Этот массив в итоге будет содержать имена всех файлов, находящихся в директории "media".
Чтобы перечислить все файлы в директории, вы можете использовать следующий код на PHP:
$dir_path = public_path() . '/dirname';
$dir = new DirectoryIterator($dir_path);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
// Здесь вы можете обработать файл, например, вывести его имя
echo $fileinfo->getFilename() . "\n";
} else {
// Эта часть кода выполняется для исключения '.' и '..'
}
}
В данном примере мы создаём объект DirectoryIterator
для указанного пути и перебираем его содержимое с помощью цикла foreach
. Внутри цикла проверяем, является ли элемент точкой, чтобы пропустить текущую и родительскую директории. Если это файл или поддиректория, вы можете выполнить с ним необходимые действия, например, вывести имя файла.
В Laravel просто используйте:
use Illuminate\Support\Facades\File;
$path = public_path();
$files = File::allFiles($path);
dd($files);
Надеюсь, это было полезно!
Как вывести сырой SQL-запрос в виде строки из билдера запросов?
Как создать пользовательские вспомогательные функции в Laravel
Ошибка "Класс 'UserTableSeeder' не существует" - Laravel 5.0 [php artisan db:seed]
Форматирование часового пояса для даты Carbon
Laravel валидация: проверка существования с условием по дополнительному столбцу - пользовательское правило валидации