簡體   English   中英

PHP從目錄和子目錄創建圖像庫

[英]PHP Create Image Gallery From Directory And Subdirectories

我正在嘗試制作一個掃描主目錄並為每個子目錄創建一個單獨相冊的圖像庫。

我的結構與此類似:

-圖庫--Subdir 1 ---圖像1 ---圖像2 --Subdir 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>";
}

您可能會考慮使用“ 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 ,避免獲取'。'。 和“ ..”目錄鏈接級別。
  • 您可以使用$ it-> setMaxDepth(5)限制掃描深度。

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

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

這是因為$val在目錄中沒有final /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM