3

我正在用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

4

2 回答 2

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'"

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

于 2012-05-03T20:59:47.047 回答
1

请检查这个在 Windows 和 Linux 服务器上都能正常工作的 PHP 函数。

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();
}
于 2013-04-03T07:29:46.180 回答