Ywis
Ywis

Reputation: 190

Cannot open zip file in Windows Explorer which generated by PHP Zip Archive

When I trying to open my zip file which is generated by PHP Zip Archive, there is an alert showing

"Windows cannot open the folder. The Compressed (zipped) Folder 'filename' is invalid." error opening in Windows Explorer.

But I can open the file through 7-zip. In some reason, I have to ensure the zip file can open by Windows Explorer. Is there any problem when I generated the zip file? Please help!

function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) {
        if(file_exists($dest) && !$overwrite) {
            return false;
        }
        $valid_files = array();
        if(is_array($files)) {
            foreach($files as $file) {
                if(file_exists($file)) {
                    $valid_files[] = $file;
                }
            }
        }

        if(count($valid_files)) {
            $zip = new ZipArchive();
            if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
                return false;
            }
            foreach($valid_files as $valid_file) {
                if(is_dir($valid_file) === true){
                    foreach(glob($valid_file . '/*') as $file){
                        $zip->addFile($file, $root_folder . $file);
                    }

                }else if (is_file($valid_file) === true){
                    $zip->addFile($valid_file, $root_folder . $valid_file);
                }
            }
            $zip->close();

            return file_exists($dest);
        }
        else
        {
            return false;
        }
    }

Upvotes: 5

Views: 11533

Answers (5)

Thiago Stipp
Thiago Stipp

Reputation: 11

Windows zip does not recognize paths begining with "/"

Just remove the first "/" in the filepath.

Like this:

if ( substr($root_folder,0,1) == '/' ) {
    $root_folder = substr($root_folder,1);
}
$zip->addFile($file, $root_folder . $file);

Upvotes: 1

Marcos Dimitrio
Marcos Dimitrio

Reputation: 6852

For me, the solution was to use ob_end_clean() before outputting zip file contents (as noted by @Ywis in the comments)...

ob_end_clean();
readfile($zipfilename); // outputs zip file's content

... even if you don't output any characters before that.

Upvotes: 18

Always 18
Always 18

Reputation: 41

Instead of using str_replace string function, you can use built-in file-system functions.

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME));

Upvotes: 0

user2367050
user2367050

Reputation: 1

Just send as parameter to absolute path for example $abspath. Then use it in

$filenameonly = str_replace($abspath,"",$file);
$zip->addFile($file, $filenameonly);

It works 100% even in Window 8 and even your files you zip are in folders.

Upvotes: 0

Flot2011
Flot2011

Reputation: 4671

I think the problem originates from:

$zip->addFile($file,$file);

Unless you have your php script in the same directory as the files you want to add to zip, you will need to include the file path. The 2nd parameter in addFile is the name of the file inside the zip, so if your $file var includes the path, that’s where the issue probably coming from. Try to change the code to :

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file);
$zip->addFile($file,$filenameonly );

which will strip out the file path (if any) and leave you only the file name for the 2nd variable in addFile.

If this will solve your problem you will know for sure that the problem was in your filenames and can pinpoint it easily.

Upvotes: 3

Related Questions