无法创建zip存档

时间:2013-04-22 04:05:25

标签: php boolean-logic ziparchive

我正在尝试调试this script以在localhost上运行。 $zip->status会返回0,根据The Manual表示“没有错误”,但file_exists()仍然返回false。

我手动检查,文件确实不存在。我在localhost上运行WAMP。

为什么这样做?我该如何解决?

这是我的确切代码:

$destination = "C:\wamp\www\temp\temp.zip";
$zip = new ZipArchive();
echo var_dump($zip);
echo "<br />";
$zzz = $zip->open($destination, ZipArchive::CREATE);
if($zzz === true) {
    echo "created archive<br />";
}else{
    //Var dump says it's true.. is that not a contradiction??
    echo var_dump($zzz)."<br />Couldn't create zipArchive<br />";
}
//add the files
foreach($_SESSION['images'] as $file) {
    $zip->addFile($file);
}

echo "Files ".$zip->numFiles."<br />Status ".$zip->status."<br />";

$zip->close();

if(!file_exists($destination)){
    echo "destination doesnt exist";        
}

这是该页面的输出..

object(ZipArchive)[1]
  public 'status' => int 0
  public 'statusSys' => int 0
  public 'numFiles' => int 0
  public 'filename' => string '' (length=0)
  public 'comment' => string '' (length=0)


created archive
Files 16
Status 0
destination doesnt exist

2 个答案:

答案 0 :(得分:4)

更新:我们在聊天中进行了一些讨论后发现,$_SESSION['images']包含http://个网址,但ZipArchive本身不支持从远程来源添加文件。如果要添加远程图像,则必须先下载它们。所以我们已将addFile()相关部分更改为:

//add the files
foreach($images as $file) {
    $tmpname = tempnam(sys_get_temp_dir(), 'test');
    file_put_contents($tmpname, file_get_contents($file));
    $zip->addFile($tmpname, basename($file));
    unlink($tmpname);
}

还有一个逻辑错误,或更好,一个错字。替换

$zzz = $zip->open($destination, ZipArchive::CREATE);
if($zzz !== true) {
    echo "created archive<br />";
} ...

通过

$zzz = $zip->open($destination, ZipArchive::CREATE);
if($zzz === true) {
    echo "created archive<br />";
} ...

进一步注意,zip是在内存中创建的,并且在调用ZipArchive::close()之前不会写入磁盘。检查手册页上的第一条评论:

  

如果你创建了一个zip文件并且没有错误地添加了一个文件,但是ZipArchive :: close调用失败了(使用ER_TMPOPEN:“创建临时文件失败”)并且没有创建zip文件,请查看如果您的ZipArchive :: open调用指定包含不存在的目录的路径名。如果您希望包含一个或多个目录的层次结构,则必须在使用ZipArchive之前自己创建它们。您可以编写一个简单的函数来使用dirname递归来查找每个父目录,在离开递归时使用mkdir创建那些不存在的目录。

答案 1 :(得分:0)

可能是因为if($zzz !== true)应该是if($zzz === true)。的xD