从目录中获取文件并将其压缩为ZIP包

时间:2013-11-15 10:13:17

标签: php ziparchive

简短说明:

目录中有一些文件

Yii::app()->runtimePath.'/temp/myDir/';

这些文件应压缩在同一目录中,如:

Yii::app()->runtimePath.'/temp/myDir/files.zip

以下构造没有错误,但是没有创建zip文件。

$zip = new ZipArchive();
$path = Yii::app()->runtimePath.'/temp/myDir/';

// Open an empty ZIP-File to write into
$ret = $zip->open('files.zip', ZipArchive::OVERWRITE);

if ($ret !== TRUE) {
    printf('Failed with code %d', $ret);
} else {
    $options = array('add_path' => $path, 'remove_all_path' => TRUE);
    $zip->addGlob('*.{png,gif,jpg,pdf}', GLOB_BRACE, $options);
    $res = $zip->close();
}

我的错误是什么?目录名称正确且可写(CHMOD 777)。

3 个答案:

答案 0 :(得分:2)

这是有效的(摘录):

$ret = $zip->open($path.'files.zip', ZipArchive::OVERWRITE);
...
$options = array('remove_all_path' => TRUE);
$zip->addGlob($path.'*.{png,gif,jpg,pdf}', GLOB_BRACE, $options);

答案 1 :(得分:0)

重新使用Alireza Fallah中的代码(How to zip a whole folder using PHP)将基本名称应用到文件的迭代中,你将拥有没有路径结构的zip :)

function create_zip($files = array(), $dest = '', $overwrite = false) {
    if (file_exists($dest) && !$overwrite) {
        return false;
    }
    if (($files)) {
        $zip = new ZipArchive();
        if ($zip->open($dest, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        foreach ($files as $file) {
            $zip->addFile($file, basename($file));
        }
        $zip->close();
        return file_exists($dest);
    } else {
        return false;
    }
}

function addzip($source, $destination) {
    $files_to_zip = glob($source . '/*');
    create_zip($files_to_zip, $destination);
    echo "done";
}

答案 2 :(得分:0)

问题很可能是传递给方法$flag的错误ZipArchive::open ( string $filename [, int $flags ] )参数。在您的情况下,它应该是$ret = $zip->open('files.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

如果zip文件尚不存在,$ret = $zip->open('files.zip', ZipArchive::OVERWRITE); var_dump($ret);将打印int(11),这是常量ZipArchive::ER_OPEN的等效值,其描述为Can't open file.