首页 / 帖子
请问如何在php代码里执行操作:将某个指定路径的文件夹压缩成一个zip文件
5个答案
陈蹊
发布于:2014-07-17 13:58

我能想到的就是用 exec 去执行 shell 的命令来压缩了……

Amanda Song
发布于:2014-07-17 14:15

http://php.net/manual/en/class.ziparchive.php


http://www.aspku.com/kaifa/php/24800.html

这两个链接或许可以发现答案。

闻涛
发布于:2014-07-17 14:19

有一个类ZipArchive,你可以试一下,主要的用法就是下面的函数,$filename是要添加的文件路径,$localname如果你用重新起个名字就用这个参数:

ZipArchive::addFile ( string $filename [, string $localname = NULL ])

具体的代码如下:

$zip = new ZipArchive();
$zip_name = "zipfile.zip";
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){
        $error .= "* Sorry ZIP creation failed at this time";
}
    
foreach($valid_files as $file){
  $zip->addFile($file);  
}

当然,我觉得简单的办法还是调用shell的zip命令。

BTW,我怎么感觉你在做自动下载系统。。。

刘伯彪
发布于:2014-07-17 17:51

ZipArchive当然是最贴切的一个做法,另外一个思路是,Backup and Migrate模块提供了将备份的数据库下载为各种扩展名的相关API函数,一般Drupal我们都会安装这个模块,所以不妨拿过来直接用。PS:对于zip,backup模块也是用ZipArchive封装的。

闻涛
发布于:2014-07-18 11:09

下面是我在D6实验的代码:

$current_dir = getcwd();
$dir_name = 'test';
$dir_path = file_directory_path() . '/' . $dir_name;
$dir_path = realpath($dir_path);
chdir($dir_path);
$zip = new ZipArchive();
$zip_name = "test.zip";
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){
  echo 'error';
}
$zip->addEmptyDir('test');
$dir = opendir($dir_path);
while (($file = readdir($dir)) !== FALSE) {
  $zip->addFile($file);
}
$zip->close();
chdir($current_dir);


再请教下,现在压缩文件是出来了,但是里面的文件结构不正常:

除了test目录,还有三个图片是对的,其它的东西都不太清楚是啥玩意。。。


解压后也是会报莫名其妙的问题,


不过把解压过程中出现的错误都关掉后,最后的文件还是解压成功了的:




还有一个问题就是,我的本意是想把所有文件放到一个新文件夹里再一起压缩:($zip->addEmptyDir('test');
),结果显示它们是并列关系,不知道该如何写才能让文件都在这个生成的test目录下?