通过PHP在主机上提取zip文件会破坏目录结构

时间:2013-08-20 13:28:12

标签: php directory zip ziparchive

我有一个像这样的目录结构:

members/
  login.php
  register.php

我在我的Windows机器上通过PHP ZipArchive压缩它们,但当我将它上传到linux主机并通过PHP提取它时,它将这些作为两个文件提供给我,没有目录:

members\login.php
members\register.php

我希望在解压缩文件后在主机上拥有完整的目录结构。 请注意,此解包代码在本地计算机中运行时没有任何问题。它是关于Windows和Linux的东西还是什么?我该如何解决?

3 个答案:

答案 0 :(得分:0)

PHP实际上并没有提供一个提取ZIP的功能,包括其目录结构。我在手册中的用户评论中找到了以下代码:

function unzip($zipfile)
{
    $zip = zip_open($zipfile);
    while ($zip_entry = zip_read($zip))    {
        zip_entry_open($zip, $zip_entry);
        if (substr(zip_entry_name($zip_entry), -1) == '/') {
            $zdir = substr(zip_entry_name($zip_entry), 0, -1);
            if (file_exists($zdir)) {
                trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR);
                return false;
            }
            mkdir($zdir);
        }
        else {
            $name = zip_entry_name($zip_entry);
            if (file_exists($name)) {
                trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR);
                return false;
            }
            $fopen = fopen($name, "w");
            fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry));
        }
        zip_entry_close($zip_entry);
    }
    zip_close($zip);
    return true;
}

来源here

答案 1 :(得分:0)

尝试DIRECTORY_SEPARATOR

而非使用:

  

$ path = $ someDirectory。'/'。$ someFile;

使用:

  

$ path = $ someDirectory。 DIRECTORY_SEPARATOR。$ someFile;

将您的代码更改为:

  

$ zip = new ZipArchive;
  if($ zip-&gt; open(“module.DIRECTORY_SEPARATOR。$ file [name]”)=== TRUE){
  $ zip-&gt; extractTo('module.DIRECTORY_SEPARATOR');
  }

它适用于两种操作系统。

祝你好运,

答案 2 :(得分:0)

问题解决了!这是我做的: 我从php.net用户评论中将创建zip文件的代码更改为此函数:

function addFolderToZip($dir, $zipArchive){
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            //Add the directory
            $zipArchive->addEmptyDir($dir);
            // Loop through all the files
            while (($file = readdir($dh)) !== false) {
                //If it's a folder, run the function again!
                if(!is_file($dir . $file)){
                    // Skip parent and root directories
                    if(($file !== ".") && ($file !== "..")){
                        addFolderToZip($dir . $file . "/", $zipArchive);
                    }
                }else{
                    // Add the files
                    $zipArchive->addFile($dir . $file);
                }
            }
        }
    }
}
$zip = new ZipArchive;
$zip->open("$modName.zip", ZipArchive::CREATE);
addFolderToZip("$modName/", $zip);
$zip->close();

在主机中我只写了这段代码来提取压缩文件:

copy($file["tmp_name"], "module/$file[name]");
$zip = new ZipArchive;
if ($zip->open("module/$file[name]") === TRUE) {
    $zip->extractTo('module/');
}
$zip->close();

它创建了文件夹和子文件夹。剩下的唯一错误是它也会提取主文件夹中所有子文件夹中的每个文件,因此子文件夹中每个文件都有两个版本。