Zip-> close()尽管检查都返回false

时间:2014-06-30 16:23:14

标签: php zip

我正在尝试使用ZipArchive类创建一个zip文件。我在这里和那里读了很多并实现了很多检查(文件存在,目录可写......)。但是zip-> close()仍然会返回'false',我无法弄清楚原因。

if (!is_writable('../temp_downloads/')) { 
    die('directory not writable'); }

function create_zip($files = array(),$destination = '',$overwrite = false) {
    $destination = "../temp_downloads/".$destination.".zip";
    if(file_exists($destination) && !$overwrite) { return false; }
        $valid_files = array();

        if(is_array($files)) {
            foreach($files as $file) {
            if(file_exists('../data/'.$file) && is_readable('../data/'.$file)) {
                $valid_files[] = $file;
            }
        }
    }

    if(count($valid_files)) {
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            exit('cannot create zip');
        }

        foreach($valid_files as $file) {
            $zip->addFile($file,$file); // result returns 'true'
        }

        $res = $zip->close(); //$res contains 'false'

        if(file_exists($destination)){
            error_log("zip exists ".$destination);
            header("Content-type: application/zip"); 
            header("Content-Disposition: attachment; filename=$destination");
            header("Content-length: " . filesize($destination));
            header("Pragma: no-cache"); 
            header("Expires: 0"); 
            readfile("$destination");
        } else {
            error_log("ERROR: Zip doesnt exist at ".$destination);
        }

        return file_exists($destination);
    } else {    
        return false;
    }
}

我用

调用此函数
create_zip($files, 'PREFIX_'.$stamp, true);

其中$ files是一个数组,$ stamp只是一个时间戳。 为了测试目标文件夹,chmod设置为777

你可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您(可能?)在zip操作中使用不正确的文件路径:

在这里查找../data/$file

if(file_exists('../data/'.$file) && is_readable('../data/'.$file)) {
    $valid_files[] = $file;

但是在拉链时间,你只有:

$zip->addFile($file,$file);

而不是

$zip->addFile("../data/$file",$file);

我不知道addFile如何返回true,除非您碰巧在脚本的当前工作目录中重复了所有这些文件,或者您正在data目录中工作../data.

相同