2

我正在尝试调试此脚本以在 localhost 上运行。return ,根据手册,这意味着“没有错误”,但仍然$zip->status返回false。0file_exists()

我手动检查,该文件实际上不存在。我在本地主机上运行 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
4

2 回答 2

4

更新:我们在聊天中进行了一些讨论后发现,它$_SESSION['images']包含http://url,但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 创建那些不存在的目录。

于 2013-04-22T04:08:59.767 回答
0

可能是因为你有if($zzz !== true)它应该在的时候if($zzz === true)。xD

于 2013-04-22T04:12:06.817 回答