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 に答える