В Laravel 5, как я могу получить список всех файлов в общей папке?
Я хотел бы автоматически генерировать список всех изображений в моей общей папке, но я не могу найти какой-либо объект, который мог бы мне помочь.
Класс Storage
кажется хорошим кандидатом на работу, но он позволяет мне искать файлы в папке хранения, которая находится за пределами общей папки.
Ответы
Ответ 1
Вы можете создать другой диск для класса Storage. Это было бы лучшим решением для вас, на мой взгляд.
В config/filesystems.php в массиве дисков добавьте нужную папку. общедоступная папка в этом случае.
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path().'/app',
],
'public' => [
'driver' => 'local',
'root' => public_path(),
],
's3' => '....'
Затем вы можете использовать класс Хранение для работы в вашей общей папке следующим образом:
$exists = Storage::disk('public')->exists('file.jpg');
В переменной $exists будет указано, существует ли file.jpg внутри общедоступной папки, поскольку Дисковое хранилище указывает на общедоступную папке проекта.
Вы можете использовать все методы Сеанс из документации, с помощью своего настраиваемого диска. Просто добавьте часть диска ('public').
Storage::disk('public')-> // any method you want from
http://laravel.com/docs/5.0/filesystem#basic-usage
Ответ 2
Storage::disk('local')->files('optional_dir_name');
или
array_filter(Storage::disk('local')->files(), function ($item) {return strpos($item, 'png');});
Обратите внимание, что laravel disk имеет files()
и allfiles()
. allfiles
является рекурсивным.
Ответ 3
Рассмотрим использование glob. Нет необходимости переназначать баребоны PHP с помощью вспомогательных классов/методов в Laravel 5.
<?php
foreach (glob("/location/for/public/images/*.png") as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
?>
Ответ 4
Для просмотра всех файлов в каталоге используйте эту
$dir_path = public_path() . '/dirname';
$dir = new DirectoryIterator($dir_path);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
}
else {
}
}
Ответ 5
Чтобы просмотреть все изображения в вашем общедоступном каталоге, попробуйте это: см. Здесь http://php.net/manual/en/class.splfileinfo.php
function getImageRelativePathsWfilenames(){
$result = [];
$dirs = File::directories(public_path());
foreach($dirs as $dir){
var_dump($dir); //actually string: /home/mylinuxiser/myproject/public"
$files = File::files($dir);
foreach($files as $f){
var_dump($f); //actually object SplFileInfo
//object(Symfony\Component\Finder\SplFileInfo)#628 (4) {
//["relativePath":"Symfony\Component\Finder\SplFileInfo":private]=>
//string(0) ""
//["relativePathname":"Symfony\Component\Finder\SplFileInfo":private]=>
//string(14) "text1_logo.png"
//["pathName":"SplFileInfo":private]=>
//string(82) "/home/mylinuxiser/myproject/public/img/text1_logo.png"
//["fileName":"SplFileInfo":private]=>
//string(14) "text1_logo.png"
//}
if(ends_with($f, ['.png', '.jpg', '.jpeg', '.gif'])){
$result[] = $f->getRelativePathname(); //prefix your public folder here if you want
}
}
}
return $result; //will be in this case ['img/text1_logo.png']
}
Ответ 6
Пожалуйста, используйте следующий код и получите все подкаталоги определенной папки в общей папке. Когда кто-то нажимает на папку, в ней отображаются файлы внутри каждой папки.
Файл контроллера
public function index() {
try {
$dirNames = array();
$this->folderPath = 'export'.DS.str_replace( '.', '_', $this->getCurrentShop->getCurrentShop()->shopify_domain ).DS.'exported_files';
$getAllDirs = File::directories( public_path( $this->folderPath ) );
foreach( $getAllDirs as $dir ) {
$dirNames[] = basename($dir);
}
return view('backups/listfolders', compact('dirNames'));
} catch ( Exception $ex ) {
Log::error( $ex->getMessage() );
}
}
public function getFiles( $directoryName ) {
try {
$filesArr = array();
$this->folderPath = 'export'.DS.str_replace( '.', '_', $this->getCurrentShop->getCurrentShop()->shopify_domain ).DS.'exported_files'. DS . $directoryName;
$folderPth = public_path( $this->folderPath );
$files = File::allFiles( $folderPth );
$replaceDocPath = str_replace( public_path(),'',$this->folderPath );
foreach( $files as $file ) {
$filesArr[] = array( 'fileName' => $file->getRelativePathname(), 'fileUrl' => url($replaceDocPath.DS.$file->getRelativePathname()) );
}
return view('backups/listfiles', compact('filesArr'));
} catch (Exception $ex) {
Log::error( $ex->getMessage() );
}
}
Маршрут (Web.php)
Route::resource('displaybackups', 'Displaybackups\BackupController')->only([ 'index', 'show']);
Route :: get ('get-files/{directoryName}', 'Displaybackups\BackupController @getFiles');
Просмотр файлов - список папок
@foreach( $dirNames as $dirName)
<div class="col-lg-3 col-md-3 col-sm-4 align-center">
<a href="get-files/{{$dirName}}" class="btn btn-light folder-wrap" role="button">
<span class="glyphicon glyphicon-folder-open folderIcons"></span>
{{ $dirName }}
</a>
</div>
@endforeach
Просмотр - список файлов
@foreach( $filesArr as $fileArr)
<div class="col-lg-2 col-md-3 col-sm-4">
<a href="{{ $fileArr['fileUrl'] }}" class="waves-effect waves-light btn green folder-wrap">
<span class="glyphicon glyphicon-file folderIcons"></span>
<span class="file-name">{{ $fileArr['fileName'] }}</span>
</a>
</div>
@endforeach