PHP从目录和子目录创建图像库


PHP Create Image Gallery From Directory And Subdirectories

我正在尝试制作一个图像库,它扫描主目录并为每个子目录创建一个单独的相册。

我的结构与此类似:

-画廊--细分曲面1---图像1---图像2--细分曲面2---图像1---图像2

我们的想法是,每个相册都将由一个类为web-gallery的div组成。然后会有一个由子目录名称制成的相册标题的标题。之后,生成每个图像的列表。这将是一个一页的画廊。如果可能的话,我希望有一个变量来设置这样列出的相册数量。如果我有30个子目录,我的页面不会太拥挤。

到目前为止,我已经写了这篇文章,但它不起作用。我没有收到任何错误或日志,尽管它只是不起作用。

$dirs = glob('img/gallery_temp/*', GLOB_ONLYDIR);
   foreach($dirs as $val) {
  echo '<div class="web-gallery">';
  echo "<h3><span>&raquo;</span> ".basename($val). "</h3>"; 
  echo '<ul class="web-gallery-list">';
 $files = glob($val.'*.{jpg,png,gif}', GLOB_BRACE);
 foreach($files as $file) {
 echo "<li><a href='".$file."'><img src='" . $file . "' alt='description'></a></li> 'r'n";
 }
echo "</ul>";
echo "</div>";
}

只需在*.{jpg,png,gif}之前添加一个/,如下所示:

$files = glob($val.'/*.{jpg,png,gif}', GLOB_BRACE);

这是因为$val没有目录的最终/

您可以考虑使用"readdir"而不是glob。Glob用于查找与模式匹配的路径名,请参见此处:http://php.net/manual/en/function.glob.php并且已知有点问题。

Readdir,如果您的目录完全是镜像,则可能更容易使用:http://php.net/manual/en/function.readdir.php

将此与is_dir()结合使用http://php.net/manual/en/function.is-dir.php以解析您的目录与文件。这是的一个片段

<?php
    if ($handle = opendir('/galleries')) {
        while (false !== ($entry = readdir($handle))) {
            // this is a subdirectory
            if (is_dir($entry)) {
            }
            // this is a file
            else {
                echo $entry;
            }
        }
        closedir($handle);
    }
?>

如果你让它成为一个递归函数,你实际上可以让它遍历多个子目录,在库中创建库。

我还发现了这个奇妙的小片段,它在另一个堆栈问题上非常优雅:用Glob 在目录和子目录中获取图像

$rdi = new RecursiveDirectoryIterator("uploads/prevImgs/");
$it = new RecursiveIteratorIterator($rdi);
foreach($it as $oneThing)
    if (is_file($oneThing))
        echo '<img src="'.$oneThing.'" /><br />';

使用SPL库(PHP>=5)

更好的解决方案是使用SPL库(最跨平台的)

$directory = new RecursiveDirectoryIterator("./img/gallery_temp", FilesystemIterator::SKIP_DOTS);
// Flatten the recursive iterator, folders come before their files
$it  = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach($it as $fileinfo)
{
    if($fileinfo->isDir())
    {
        // prevPath used to separate each directory listing and closing the bracket UL list
        $prevPath = $it->getSubPath().DIRECTORY_SEPARATOR.$fileinfo->getFilename();
        echo sprintf
        (
            "<div class='web-gallery'>
            <h3><span>></span> %s</h3>
            <ul>".PHP_EOL,
            $fileinfo->getFilename()
        );
    }
    if($fileinfo->isFile())
    {
        echo sprintf("<li><a href=''><img src='%s/%s' alt='description'></a></li>".PHP_EOL,  $it->getSubPath(), $fileinfo->getFilename());
        if($prevPath != $it->getSubPath())
            echo("</ul>");
    }
}

注:更多信息:SPL文档

  • DIRECTORY_SEPARATOR是一个跨平台常量,将使用执行代码的操作系统的正确目录分隔符
  • FilesystemIterator::SKIP_DOTS,避免获取"."answers".."目录链接级别
  • 您可以使用$it->setMaxDepth(5)来限制扫描深度