避免使用zip文件内容的绝对路径名

时间:2012-05-03 20:36:47

标签: php linux zip

我在用PHP写作。我有以下代码:

$folder_to_zip = "/var/www/html/zip/folder";
$zip_file_location = "/var/www/html/zip/archive.zip";
$exec = "zip -r $zip_file_location  '$folder_to_zip'";

exec($exec);

我想将zip文件存储在/var/www/html/zip/archive.zip,但是当我打开该zip文件时,整个服务器路径都在zip文件中。如何编写此代码以使服务器路径不在zip文件中?

运行此命令的脚本不在同一目录中。它位于/var/www/html/zipfolder.php

2 个答案:

答案 0 :(得分:5)

zip倾向于存储具有访​​问它们的任何路径的文件。 Greg的评论为您提供了针对当前目录树的特定修复程序。更一般地说,你可以 - 有点粗暴 - 做这样的事情

$exec = "cd '$folder_to_zip' ; zip -r '$zip_file_location  *'"

通常你希望最后一个目录成为存储名称的一部分(它有点礼貌,所以无论是解压缩还是不将所有文件都转储到它们的主目录或其他内容中),你可以通过将其分成带有文本处理工具的单独变量,然后执行类似

的操作
$exec = "cd '$parent_of_folder' ; zip -r '$zip_file_location $desired_folder'"

警告:没有时间测试任何这些愚蠢的错误

答案 1 :(得分:1)

请检查这个在Windows和Windows上运行良好的PHP函数。 Linux服务器。

function Zip($source, $destination, $include_dir = false)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = realpath($source);

    if (is_dir($source) === true)
    {

        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        if ($include_dir) {

            $arr = explode(DIRECTORY_SEPARATOR, $source);
            $maindir = $arr[count($arr)- 1];

            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) {
                $source .= DIRECTORY_SEPARATOR . $arr[$i];
            }

            $source = substr($source, 1);

            $zip->addEmptyDir($maindir);

        }

        foreach ($files as $file)
        {
            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . DIRECTORY_SEPARATOR, '', $file . DIRECTORY_SEPARATOR));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . DIRECTORY_SEPARATOR, '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}