【问题标题】:Extract a folder and then search for specific file in PHP提取文件夹,然后在 PHP 中搜索特定文件
【发布时间】:2014-11-05 13:30:51
【问题描述】:

我正在构建一个 php 程序,它会上传一个 zip 文件,将其解压缩并为解压缩文件夹中的特定文件生成一个链接。上传和提取文件夹工作正常。现在我有点卡住下一步该做什么。我必须处理刚刚提取的文件夹并找到其中的(唯一)html 文件。然后必须生成指向该文件的链接。

这是我目前使用的代码:

$zip = new ZipArchive();
if ($zip->open($_FILES['zip_to_upload']['name']) === TRUE) 
{
    $folderName = trim($zip->getNameIndex(0), '/');
    $zip->extractTo(getcwd());
    $zip->close();
} 
else 
{
    echo 'Es gab einen Fehler beim Extrahieren der Datei';
}

$dir = getcwd();
$scandir = scandir($dir);

foreach ($scandir as $key => $value)
{
    if (!in_array($value,array(".",".."))) //filter . and  .. directory on linux-systems
    {
        if (is_dir($dir . DIRECTORY_SEPARATOR . $value) && $value == $folderName)
        {
            foreach (glob($value . "/*.html") as $filename) {
                $htmlFiles[] = $filename; //this is for later use
                echo "<a href='". SK_PICS_SRV . DIRECTORY_SEPARATOR . $filename . "'>" . SK_PICS_SRV . DIRECTORY_SEPARATOR . $filename . "</a>";
            }
        }
    }
}

所以这段代码似乎可以工作。我刚刚注意到一个相当奇怪的问题。 $zip->getNameIndex[0] 函数的行为取决于创建 zip 文件的程序。当我用 7zip 制作一个 zip 文件时,一切似乎都没有问题。 $folderName 包含我刚刚提取的主文件夹的正确名称。例如“文件夹 01”。但是当我用普通的 Windows zip 程序压缩它时,excat 相同的文件夹(相同的结构和相同的包含文件) $zip->getNameIndex[0] 包含错误的值。例如“文件夹 01/images/”或“文件夹 01/example.html”。所以它似乎以不同的方式/以错误的方式读取 zip 文件。你们知道该错误来自哪里或我如何避免它?这对我来说真的很奇怪。

【问题讨论】:

  • 您必须转到提取文件的文件夹,通读该文件夹以找到文件并根据该信息生成链接。
  • 您是否有可能通过您的代码进行调试,这样您就可以检查哪里有遗漏或错误?似乎 $value 可能为空。每个循环中 $value 的值是多少?
  • 尝试使用 DIRECTORY_SEPARATOR 而不是 DS。我要禁食,因为没有你自己定义的 DS 常数,我很抱歉
  • 所以它似乎工作了!我更新了我的帖子以解决最后一步。
  • 您可以将上传的文件夹提取到带有时间戳或某事物的子文件夹中。就像它的名字一样,所以你参考这个,或者你检查文件夹的修改日期选择最新的(应该是刚刚上传的;见stat-function

标签: php path ftp zip extract


【解决方案1】:

因为您自己指定了提取路径,您可以尝试使用 php 的函数“glob”查找文件

看看手册:

Glob

此函数将返回与搜索模式匹配的文件的名称。 使用您的提取路径,您现在有了指向该文件的链接。

$dir = "../../suedkurier/werbung/"
$scandir = scandir($dir);
foreach ($scandir as $key => $value)
{
  if (!in_array($value,array(".",".."))) //filter . and  .. directory on linux-systems
  {
     if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
     {
         foreach (glob($dir . DIRECTORY_SEPARATOR . $value . "/*.html") as $filename) {
           $files[] = $value . DIRECTORY_SEPARATOR $filename;
        }
     }
  }
} 

匹配的文件现在将保存在数组 $files 中(带有子文件夹) 所以你的路径就像

foreach($files as $file){
  echo  $dir . DIRECTORY_SEPARATOR . $file;
}

【讨论】:

  • 感谢您的回复。如果文件位于通用文件夹“../../suedkurier/werbung/”中,则此方法有效。但就我而言,整个提取的文件夹都位于该路径中。所以它看起来像 "../../suedkurier/werbung/folder1/" 我必须在文件夹 1 中搜索 html 文件。我想上传很多文件夹,所以当有一个 folder3 时,它应该找到这个特定文件夹的 html。我事先不知道提取文件夹的名称。
  • 所以您可以尝试将我的答案与詹姆斯的答案结合起来。尝试使用 scandir 查找提取的文件夹(例如文件夹 1、文件夹 2 等)(使用 is_dir() 检查目录),然后您可以在这些目录中使用 glob 函数。在这种情况下,您有 2 个嵌套的 foreach 循环
  • 听起来不错。不幸的是,我对 PHP 还很陌生,并且正在努力编写代码。您可以在这里发布完整的代码作为答案吗?那真的很有帮助。
  • 我编辑了我的答案,希望对你有所帮助。注意:我没有测试过这个
  • 感谢您的回答。我编辑了我最初的帖子,因为我还有一些问题。
【解决方案2】:
$dir = "the/Directory/You/Extracted/To";
$files1 = scandir($dir);
foreach($files1 as $str)
{
    if(strcmp(pathinfo($str, PATHINFO_EXTENSION),"html")===0||strcmp(pathinfo($str, PATHINFO_EXTENSION),"htm")===0)
    {
        echo $str;
    }

}

获取目录中每个文件的数组,检查每个文件的扩展名是否为htm/html,如果为真则回显名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2010-12-21
    • 1970-01-01
    • 2015-08-15
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多