Sebastian Saier
Sebastian Saier

Reputation: 35

Extract a folder and then search for specific file in PHP

I´m building a php programm which uploads a zip file, extracts it and generates a link for a specific file in the extracted folder. Uploading and extracting the folder works fine. Now I´m a bit stuck what to do next. I have to adress the just extracted folder and find the (only) html file that is in it. Then a link to that file has to be generated.

Here is the code I´m using currently:

$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>";
            }
        }
    }
}

So this code seems to be working. I just noticed a rather strange problem. The $zip->getNameIndex[0] function behaves differently depending on the program that created the zip file. When I make a zip file with 7zip all seems to work without a problem. $folderName contains the right name of the main folder which I just extracted. For example "folder 01". But when I zip it with the normal windows zip programm the excat same folder (same structure and same containing files) the $zip->getNameIndex[0] contains the wrong value. For example something like "folder 01/images/" or "folder 01/example.html". So it seems to read the zip file differently/ in a wrong way. Do you guys know where that error comes from or how I can avoid it? This really seems strange to me.

Upvotes: 2

Views: 1547

Answers (2)

empiric
empiric

Reputation: 7878

Because you specify the extract-path by yourself you can try finding your file with php's function "glob"

have a look at the manual:

Glob

This function will return the name of the file matching the search pattern. With your extract-path you now have your link to the file.

$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;
        }
     }
  }
} 

The matched files will now be saved in the array $files (with the subfolder) So you get your path like

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

Upvotes: 1

James Hunt
James Hunt

Reputation: 2528

$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;
    }

}

Get an array of each file in the directory, check the extension of each one for htm/html, then echo the name if true.

Upvotes: 1

Related Questions