Search code examples
phpphp-ziparchive

How to remove __MACOSX while using ZipArchive


After hours of trying to figure out why php "ZipArchive" does not work as expected, due to Mac OS adding a "__MACOSX" folder in the zip compression process.

How would I go about deleting "__MACOSX" folder in a zip archive during the upload process in a form?

Below is what I'm working with:

<?php
 public function uploadZip($file)
    {

        $advert_index;

        $zip = new \ZipArchive;

        if (true === $zip->open($file['tmp_name'])) {

            $source = trim($zip->getNameIndex(0), '/');

            for ($i = 0; $i < $zip->numFiles; $i++) {
                $name = $zip->getNameIndex($i);

                // Determine output filename (removing the `$source` prefix).
                $substring_name = substr($name, strlen($source)+1);
                $file = $this->option['uploads_path'] . $this->option['advert_id'] . '/' . $substring_name;

                // Store the adverts `index.html` file URL to be returned.
                if ('html' === pathinfo($name, PATHINFO_EXTENSION)) {
                    $advert_index = basename($name);
                }

                // Create the directories if necessary.
                $dir = dirname($file);
                if (! is_dir($dir)) {
                    mkdir($dir, 0777, true);
                }

                // Read from Zip and write to disk.
                $fpr = $zip->getStream($name);
                $fpw = fopen($file, 'w');
                while ($data = fread($fpr, 1024)) {
                    fwrite($fpw, $data);
                }
                fclose($fpr);
                fclose($fpw);
            }
            $zip->close();

            return array(
                'status' => true,
                'message' => array(
                    'index' => $advert_index,
                    'type' => 'text/html',  // @HACK: Set MIME type manually. @TODO: Read MIME type from file.
                ),
            );
        }

        return array(
            'status' => false,
            'message' => 'Upload failed',
        );
    }

Any help would be much appreciated :)

Note: I Managed to find the file just can't get it to be removed.

// Check to see the __MACOSX
if($zip->getNameIndex($i) === "__MACOSX/") {
    error_log($zip->getNameIndex($i) . ' - Error here continue');
    $zip->deleteName("__MACOSX/");
    continue; // Move on to the next iteration
    // $zip->deleteIndex($i);

} else {
    $name = $zip->getNameIndex($i);
}

Solution

  • It was actually very simple, instead to trying to delete the folder within the zip-archive just had to skip all indexes aka filename that begin with a certain string while looping through the files.

    if(substr($zip->getNameIndex($i), 0, 9) === "__MACOSX/") {
       continue;
    } else {
           $name = $zip->getNameIndex($i);
    }