2016-11-14 137 views
0

我有一个名为“检查”的文件夹,其中有一些名为“位置1”,“位置2”,“位置3”等子文件夹, 10-20个PNG图像。PHP - 阅读文件夹,所有子文件夹和子文件夹中的文件

我想要做的是读取“检查”文件夹的目录,然后读取每个文件夹中的所有图像文件,然后将它们作为我的index.php网站上的图库返回。问题是我没有收到错误消息,但脚本不返回任何内容。我相信问题在于为每个子文件夹生成$ files变量,因为我部署了相同的脚本来读取另一个站点上的文件夹内容。

也许有人可以指出我正确的方向吗?

<?php 
$dir = './inspections/'; 
if ($handle = opendir($dir)) 
{ 
    $blacklist = array('.', '..', 'default', 'default.php', 'desc.txt'); 
    while (false !== ($folder = readdir($handle))) 
    { 
     if (!in_array($folder, $blacklist)) 
     { 
      if (file_exists($dir . $folder . '/desc.txt')) 
       { 
        while (false !== ($file = readdir($handle))) 
        { 
         if (!in_array($file, $blacklist)) 
         { 
          $chain = file_get_contents($dir . $folder . '/chain.txt'); 
          $website = file_get_contents($dir . $folder . '/website.txt'); 
          $location = file_get_contents($dir . $folder . '/location.txt'); 
          $desc = file_get_contents($dir . $folder . '/desc.txt', NULL, NULL, 0, 250) . '...'; 
          echo " 
           <!-- Post --> 
           <div class=\"post\"> 
            <div class=\"user-block\"> 
            <img class=\"img-circle img-bordered-sm\" src=\"../dist/img/logo/logo_".$chain."\" alt=\"\"> 
             <span class=\"username\"> 
              <a href=\"".$website."\" target=\"_blank\">".$folder."</a> 
             </span> 
            <span class=\"description\"><i class=\"fa fa-map-pin\"></i> ".$location." - Posted on ". $date . "</span> 
            </div> 
            <!-- /.user-block --> 
            <p>".$desc."</p> 
            <div class=\"lightBoxGallery\"> 
            <a href=\"".$dir . $folder . "/".$file."\" title=\"".$file."\" data-gallery=\"\"><img src=\"".$dir . $folder . "/".$file."\" style=\"height:100px; width:100px;\"></a> 
            </div> 
          "; 
         } 
        } 
       } 
     } 
    } 
    closedir($handle); 
} 
?> 

编辑: 以下@JazZ的建议,我已经调整了代码,现在工作得很好,但是,假设不希望显示调整大小的图片本身是一个,而是存储在一个子文件夹,而缩略图(例如, ./location1/thumbs/),我会怎么做呢?

<?php     
$dir = './inspections/'; 
if ($handle = opendir($dir)) { 
    $blacklist = array('.', '..', 'default', 'default.php', 'desc.txt'); 
    while (false !== ($folder = readdir($handle))) { 
     if (!in_array($folder, $blacklist)) { 

        echo " 
         <!-- Post --> 
         <div class=\"post\"> 
          <div class=\"user-block\"> 
          <img class=\"img-circle img-bordered-sm\" src=\"../dist/img/logo/gallery_icon_".$chain.".jpg\" alt=\"\"> 
           <span class=\"username\"> 
            <a href=\"".$website."\" target=\"_blank\">".$hotel_name."</a>".$status." 
           </span> 
          <span class=\"description\"><i class=\"fa fa-map-pin\"></i> ".$location." - Posted on ".date('jS F, Y - H:m', strtotime($posted_on))."</span> 
          </div> 
          <!-- /.user-block --> 

          <p>".$desc."</p> 
          <div class=\"lightBoxGallery\"> 
        "; 

        foreach (glob($dir . $folder . "/*.jpg") as $filename) { 
         echo " 
          <a href=\"".$filename."\" title=\"\" data-gallery=\"\"><img src=\"".$filename."\" style=\"height:100px; width:100px;\"></a>"; 
        } 
        echo "</div> 
         </div> 
         <!-- /. POST --> 

         "; 

     } 
    } 
    closedir($handle); 
} 
?> 

回答

1

我觉得你的问题都来源于这里:

while (false !== ($file = readdir($handle))) // it reads again the same directory as it did in the first while loop 

尝试

if ($sub_handle = opendir($dir . $folder)) { 
    while (false !== ($file = readdir($sub_handle))) { 
     ... 
    } 
    closedir($sub_handle); 
} 

来代替也行,你的情况,我会用PHP glob() function

见一个适用于您的案例的实例:

$dir = './inspections/'; 
if ($handle = opendir($dir)) { 
    $blacklist = array('.', '..', 'default', 'default.php', 'desc.txt'); 
    while (false !== ($folder = readdir($handle))) { 
     if (!in_array($folder, $blacklist)) { 
      foreach (glob($dir . $folder . "/*.png") as $filename) { 
       echo "$filename was found !"; 
       echo "\r\n"; 
      } 
     } 
    } 
    closedir($handle); 
} 

输出:

./inspections/location_4/img_1.png was found ! 
./inspections/location_4/img_2.png was found ! 
./inspections/location_4/img_3.png was found ! 
./inspections/location_4/img_4.png was found ! 
./inspections/location_4/img_5.png was found ! 
./inspections/location_4/img_6.png was found ! 
./inspections/location_3/img_1.png was found ! 
./inspections/location_3/img_2.png was found ! 
./inspections/location_3/img_3.png was found ! 
./inspections/location_3/img_4.png was found ! 
./inspections/location_3/img_5.png was found ! 
./inspections/location_3/img_6.png was found ! 
./inspections/location_2/img_1.png was found ! 
./inspections/location_2/img_2.png was found ! 
./inspections/location_2/img_3.png was found ! 
./inspections/location_2/img_4.png was found ! 
./inspections/location_2/img_5.png was found ! 
./inspections/location_2/img_6.png was found ! 
./inspections/location_1/img_1.png was found ! 
./inspections/location_1/img_2.png was found ! 
./inspections/location_1/img_3.png was found ! 
./inspections/location_1/img_4.png was found ! 
./inspections/location_1/img_5.png was found ! 
./inspections/location_1/img_6.png was found ! 

编辑

要在/检查/ LOCATION1 /大拇指/目录循环,这会工作:

foreach (glob($dir . $folder . "/thumbs/*.png") as $filename) { 
    echo "$filename was found !"; 
    echo "\r\n"; 
} 

RE-EDIT

glob的要与​​3210功能的多个文件夹,你的代码应该是这样的:

foreach (glob($dir.$folder."{/thumbs/*.png,/*.png}", GLOB_BRACE) as $filename) { 
    echo "$filename was found !"; 
    echo "\r\n"; 
} 
+0

完美无缺地工作,谢谢。我建议的唯一的事情就是调整脚本以接受各种图像,而不仅限于* .png(尽管这只是我需要和要求的,只是一个建议)。非常感谢! – Armitage2k

+0

假设每个位置文件夹中都有一个'/ thumbs /'文件夹,那么如何将该文件夹包含到$ filename数组中?我想为每个找到的$ filename显示$ thumb,但这意味着该数组需要“foreach循环”的多个变量,这可以完成吗? – Armitage2k

+0

您能否以新的要求更新您的问题。今天下午会看。 – JazZ

0

也许下面的函数帮助。它也有些评论。它递归扫描一个目录(在这种情况下,从每个目录/子目录中提取图像文件)。

<?php 

    $rootPath = './inspections/'; 
    $regex  = "#(\.png$)|(\.jpg$)|(\.jpeg$)|(\.tiff$)|(\.gif$)#"; 


    /** 
    * @param string $directory => DIRECTORY TO SCAN 
    * @param string $regex  => REGULAR EXPRESSION TO BE USED IN MATCHING FILE-NAMES 
    * @param string $get   => WHAT DO YOU WANT TO GET? 'dir'= DIRECTORIES, 'file'= FILES, 'both'=BOTH FILES+DIRECTORIES 
    * @param bool $useFullPath => DO YOU WISH TO RETURN THE FULL PATH TO THE FOLDERS/FILES OR JUST THEIR BASE-NAMES? 
    * @param array $dirs   => LEAVE AS IS: USED DURING RECURSIVE TRIPS 
    * @return array 
    */ 
    function scanDirRecursive($directory, $regex=null, $get="file", $useFullPath=false, &$dirs=[], &$files=[]) { 
     $iterator    = new DirectoryIterator ($directory); 
     foreach($iterator as $info) { 
      $fileDirName  = $info->getFilename(); 

      if ($info->isFile() && !preg_match("#^\..*?#", $fileDirName)) { 
       if($get == 'file' || $get == 'both'){ 
        if($regex) { 
         if(preg_match($regex, $fileDirName)) { 
          if ($useFullPath) { 
           $files[] = $directory . DIRECTORY_SEPARATOR . $fileDirName; 
          } 
          else { 
           $files[] = $fileDirName; 
          } 
         } 
        }else{ 
         if($useFullPath){ 
          $files[] = $directory . DIRECTORY_SEPARATOR . $fileDirName; 
         }else{ 
          $files[] = $fileDirName; 
         } 
        } 
       } 
      }else if ($info->isDir() && !$info->isDot()) { 
       $fullPathName = $directory . DIRECTORY_SEPARATOR . $fileDirName; 
       if($get == 'dir' || $get == 'both') { 
        $dirs[]  = ($useFullPath) ? $fullPathName : $fileDirName; 
       } 
       scanDirRecursive($fullPathName, $regex, $get, $useFullPath, $dirs, $files); 
      } 
     } 

     if($get == 'dir') { 
      return $dirs; 
     }else if($get == 'file'){ 
      return $files; 
     } 
     return ['dirs' => $dirs, 'files' => $files]; 
    } 

    $images = scanDirRecursive($rootPath, $regex, 'file', true); 
    var_dump($images); 
相关问题