我正在尝试调试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
答案 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