在将此帖标记为重复之前,请注意我已经在SO上搜索答案,并且迄今为止找到的答案(以下列出)并不是我正在寻找的完全符合要求的答案。
这只是我查看过的一些问题。
我的问题是:我不能使用addFromString方法,我必须使用addFile方法,这是任务的要求。
我已经尝试了几种方法,以下是我的当前版本:
上面的内容大部分都是从某个地方看到的示例代码直接复制过来的。如果有人能指点我一个好的方向,我将不胜感激!
***** 更新 ***** 我加了一个if语句来围绕着关闭标签,就像这样:
我的问题是:我不能使用addFromString方法,我必须使用addFile方法,这是任务的要求。
我已经尝试了几种方法,以下是我的当前版本:
public function getZippedFiles($path)
{
$real_path = WEBROOT_PATH.$path;
$files = new RecursiveIteratorIterator (new RecursiveDirectoryIterator($real_path), RecursiveIteratorIterator::LEAVES_ONLY);
//# create a temp file & open it
$tmp_file = tempnam($real_path,'');
$zip_file = preg_replace('"\.tmp$"', '.zip', $tmp_file);
$zip = new ZipArchive();
$zip->open($zip_file, ZipArchive::CREATE);
foreach ($files as $name=>$file)
{
error_log(print_r($name, true));
error_log(print_r($file, true));
if ( ($file == ".") || ($file == "..") )
{
continue;
}
$file_path = $file->getRealPath();
$zip->addFile($file_path);
}
$zip->close();
}
当我尝试打开生成的文件时,会提示“Windows无法打开文件夹。压缩(zipped)文件夹''无效。”
我已成功使用addFromString完成了任务,如下所示:
$file_path = WEBROOT_PATH.$path;
$files = array();
if (is_dir($file_path) == true)
{
if ($handle = opendir($file_path))
{
while (($file = readdir($handle)) !== false)
{
if (is_dir($file_path.$file) == false)
{
$files[] = $file_path."\\".$file;
}
}
//# create new zip opbject
$zip = new ZipArchive();
//# create a temp file & open it
$tmp_file = tempnam($file_path,'');
$zip_file = preg_replace('"\.tmp$"', '.zip', $tmp_file);
$zip->open($zip_file, ZipArchive::CREATE);
//# loop through each file
foreach($files as $file){
//# download file
$download_file = file_get_contents($file);
//#add it to the zip
$zip->addFromString(basename($file),$download_file);
}
//# close zip
$zip->close();
}
}
}
上面的内容大部分都是从某个地方看到的示例代码直接复制过来的。如果有人能指点我一个好的方向,我将不胜感激!
***** 更新 ***** 我加了一个if语句来围绕着关闭标签,就像这样:
if (!$zip->close()) {
echo "failed writing zip to archive";
}
该消息被回显出来,显然问题就在那里。我还检查了$zip->open()
是否正常工作,并确认它可以正常打开。