php ziparchive压缩文件夹时,Zip文件目录结构不对

function addFileToZip($path, $zip) {
    $handler = opendir($path);
    while (($filename = readdir($handler)) !== false) {
        if ($filename != "." && $filename != "..") {
            if (is_dir($path . "/" . $filename)) {
                $this->addFileToZip($path . "/" . $filename, $zip);
            } else { //将文件加入zip对象
                $zip->addFile($path . "/" . $filename);
            }
        }
    }
    @closedir($path);
}


$zip = new ZipArchive();
if ($zip->open("test.zip", ZipArchive::OVERWRITE) === TRUE) {
    addFileToZip("1735", $zip);
    $zip->close();
}

1、上面这段代码是吧当前目录下的名为1735的文件夹中的内容压缩到test.php,这时候压缩出来的zip文件的目录
结构没有问题
2、但当目标文件夹的位置不是在同级目录时,比如addFileToZip("tt/1735", $zip);
这时候压缩出来的zip文件的目录结构就多了一层tt文件夹

3、Q:有没有办法当目标文件不在同级文件夹时,压缩出来的zip包目录结构也只有一层?

阅读 13.5k
4 个回答

兄弟,不知道你解决了没有,,我也和你一样的问题 ,,我也不知道怎么解决?

我最后解决了

使用zip下的renameName,在$zip->addFile($path.$filename);后面再加入一个函数就行了$zip->renameName($path.$filename,$filename);就不会出现多级目录了.

新手上路,请多包涵

你们怎么解决的啊,按照楼上的办法他把我本来压缩文件夹里面的目录结构也都搞没了,如果想保留本来压缩有的结构,去掉他的那些多出来的父结构应该怎么做哦?

新手上路,请多包涵

function addFileToZip($path, ZipArchive $zip, $sub_dir = '')
{

$handler = opendir($path);
while (($filename = readdir($handler)) !== false)
{
    if ($filename != "." && $filename != "..")
    {
        //文件夹文件名字为'.'和‘..’,不要对他们进行操作
        if (is_dir($path . $filename))
        {
            // 如果读取的某个对象是文件夹,则递归
            addFileToZip($path . $filename . '/', $zip, $filename . '/' );
        }
        else
        {
            //将文件加入zip对象
            $zip->addFile($path . $filename, $sub_dir . $filename );
        }
    }
}
@closedir($path);

}

新手上路,请多包涵
public function addFileToZip($path, ZipArchive $zip, $sub_dir = ''){
    $handler = opendir($path);
    while (($filename = readdir($handler)) !== false)
    {
        if ($filename != "." && $filename != "..")
        {
            //文件夹文件名字为'.'和‘..’,不要对他们进行操作
            if (is_dir($path . $filename))
            {
                $localPath = $sub_dir.$filename.'/'; //关键在这里,需要加上上一个递归的子目录
                // 如果读取的某个对象是文件夹,则递归
                $this->addFileToZip($path . $filename . '/', $zip, $localPath);
            }
            else
            {
                //将文件加入zip对象
                $zip->addFile($path . $filename, $sub_dir . $filename );          
       //$sub_dir . $filename 这个参数是你打包成压缩文件的目录结构,可以调整这里的规则换成你想要存的目录
            }
        }
    }
    @closedir($path);
}


//调用的时候,
$zip = new ZipArchive(); //压缩文件
$needZipFile = '../../example';
$targetZipFile = 'targetZip.zip';
if ($zip->open($targetZipFile, ZipArchive::CREATE) === TRUE) {
    $this->addFileToZip($needZipFile, $zip,'example/'); 
    //  ‘example/’这个参数要传,是你打包生成后的根目录名称,你可以随意换成你想要的目录名称
    $zip->close(); //关闭处理的zip文件
}

   //提供下载功能
   $downname = "example.zip";
    $fp = fopen($targetZipFile, "r");
    $file_size = filesize($targetZipFile);//获取文件的字节
    //下载文件需要用到的头
    Header("Content-type: application/octet-stream");
    Header("Accept-Ranges: bytes");
    Header("Accept-Length:" . $file_size);
    Header("Content-Disposition: attachment; filename=$downname");
    $buffer = 1024;  //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
    $file_count = 0; //读取的总字节数
    //向浏览器返回数据  如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成
    while (!feof($fp) && $file_count < $file_size) {
        $file_con = fread($fp, $buffer);
        $file_count += $buffer;
        echo $file_con;
    }
    fclose($fp);
    //下载完成后删除压缩包,临时文件夹
    if ($file_count >= $file_size) {
        unlink($targetZipFile);
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏