提取文件夹,然后在PHP中搜索特定文件

提取文件夹,然后在PHP中搜索特定文件,php,path,ftp,zip,extract,Php,Path,Ftp,Zip,Extract,我正在构建一个php程序,它上传一个zip文件,提取它,并在提取的文件夹中为一个特定的文件生成一个链接。上传和解压缩文件夹工作正常。现在我有点困惑,下一步该怎么办。我必须处理刚刚提取的文件夹,并找到其中的(唯一)html文件。然后必须生成指向该文件的链接 以下是我目前使用的代码: $zip = new ZipArchive(); if ($zip->open($_FILES['zip_to_upload']['name']) === TRUE) { $folderName = t

我正在构建一个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=new ZipArchive();
如果($zip->open($\u文件['zip\u-to\u-upload']['name'])==TRUE)
{
$folderName=trim($zip->getNameIndex(0),'/');
$zip->extractTo(getcwd());
$zip->close();
} 
其他的
{
echo’s gab einen Fehler beim Extrahieren der Datei’;
}
$dir=getcwd();
$scandir=scandir($dir);
foreach($scandir as$key=>$value)
{
如果(!in_array($value,array(“.”,“.”))//filter.and..linux系统上的目录
{
if(is_dir($dir.DIRECTORY_SEPARATOR.$value)&&$value==$folderName)
{
foreach(glob($value./*.html)作为$filename){
$htmlFiles[]=$filename;//供以后使用
回声“;
}
}
}
}
所以这段代码似乎是有效的。我刚刚注意到一个相当奇怪的问题。$zip->getNameIndex[0]函数的行为因创建zip文件的程序而异。当我用7zip创建一个zip文件时,所有这些似乎都可以正常工作$folderName包含我刚才提取的主文件夹的正确名称。例如“文件夹01”。但是当我用普通的windows zip程序压缩它时,excat相同的文件夹(相同的结构和相同的包含文件)$zip->getNameIndex[0]包含错误的值。例如“folder01/images/”或“folder01/example.html”。因此,它似乎以不同/错误的方式读取zip文件。你们知道那个错误是从哪里来的吗?或者我怎样才能避免它?这对我来说真的很奇怪

$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,如果为true,则回显名称。

因为您自己指定了提取路径,所以可以尝试使用php函数“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;
}

您必须转到提取文件的文件夹,通读该文件夹才能找到文件并根据该信息生成链接。您是否有可能通过代码进行调试,以便检查缺少或错误的地方?看起来$value可能是空的。每个循环中$value的值是多少?请尝试使用目录分隔符而不是DS。我很快就明白了,因为没有DS常数,你不能自己定义它,我道歉,所以它似乎起作用了!我更新了我的帖子,以解决最后一步。您可以在子文件夹中删除上载的文件夹,并在其名称中添加时间戳或类似的内容,以便您参考此内容,或者检查文件夹的修改日期,并选择最新的文件夹(应为刚刚上载的文件夹;请参阅),谢谢您的回复。如果文件位于常规文件夹“../../suedkurier/werbung/”中,则此选项有效。但在我的例子中,整个提取的文件夹都位于该路径中。所以它看起来像“../../suedkurier/werbung/folder1/”,我必须在folder1中搜索html文件。我想上传很多文件夹,所以当有一个folder3时,它应该会找到这个特定文件夹的html。我事先不知道提取文件夹的名称。所以你可以尝试将我的答案与James的答案结合起来。尝试使用scandir查找已提取的文件夹(例如folder1、folder2等)(使用is_dir()检查目录),然后可以在这些目录中使用glob函数。在本例中,您有两个嵌套的foreach循环,听起来不错。不幸的是,我对PHP非常陌生,正在努力编写代码。你能把完整的代码贴在这里作为答案吗?那真的很有帮助。我编辑了我的答案,希望这对你有帮助。注意:我没有测试过这个。谢谢你的回答。我编辑了我的第一篇文章,因为我还有一些问题。