0

В Laravel, как получить список всех файлов в публичной папке?

9

Я хотел бы автоматически создать список всех изображений в своей публичной папке, но не могу найти подходящий объект для этой задачи.

Класс Storage кажется неплохим кандидатом для этого, но он позволяет искать файлы только в папке хранения, которая находится вне публичной папки.

5 ответ(ов)

0

Вы можете создать дополнительный диск для класса 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);

А часть конфигурации и предыстория приведены выше в моем оригинальном ответе.

0

Для получения списка файлов из локального диска в 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 файлами из указанной директории и всех её подпапок.

0

Чтобы получить публичный путь к директории, воспользуйтесь пространством имен 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".

0

Чтобы перечислить все файлы в директории, вы можете использовать следующий код на 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. Внутри цикла проверяем, является ли элемент точкой, чтобы пропустить текущую и родительскую директории. Если это файл или поддиректория, вы можете выполнить с ним необходимые действия, например, вывести имя файла.

0

В Laravel просто используйте:

use Illuminate\Support\Facades\File;

$path = public_path();
$files = File::allFiles($path);

dd($files);

Надеюсь, это было полезно!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь