2

私はこのようなディレクトリ構造を持っています:

members/
  login.php
  register.php

Windows マシンで PHP ZipArchive を使用してそれらを圧縮しますが、それを Linux ホストにアップロードして PHP で抽出すると、これらはディレクトリのない 2 つのファイルとして得られます。

members\login.php
members\register.php

ファイルを解凍した後、ホスト上に完全なディレクトリ構造が必要です。この解凍コードは、私のローカル マシンでは問題なく実行されることに注意してください。それはWindowsとLinuxに関するものですか、それとも何ですか?どうすれば解決できますか?

4

3 に答える 3

0

DIRECTORY_SEPARATORを試してください

使用する代わりに:

$path = $someDirectory.'/'.$someFile;

使用する:

$path = $someDirectory. DIRECTORY_SEPARATOR .$someFile;

コードを次のように変更します。

$zip = 新しい ZipArchive;
if ($zip->open("module.DIRECTORY_SEPARATOR .$file[name]") === TRUE) {
$zip->extractTo('module.DIRECTORY_SEPARATOR');
}

また、両方のオペレーティング システムで動作します。

幸運を、

于 2013-08-20T13:51:19.830 に答える
0

PHP は実際には、ディレクトリ構造を含む ZIP を抽出する関数を提供していません。マニュアルのユーザー コメントで次のコードを見つけました。

function unzip($zipfile)
{
    $zip = zip_open($zipfile);
    while ($zip_entry = zip_read($zip))    {
        zip_entry_open($zip, $zip_entry);
        if (substr(zip_entry_name($zip_entry), -1) == '/') {
            $zdir = substr(zip_entry_name($zip_entry), 0, -1);
            if (file_exists($zdir)) {
                trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR);
                return false;
            }
            mkdir($zdir);
        }
        else {
            $name = zip_entry_name($zip_entry);
            if (file_exists($name)) {
                trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR);
                return false;
            }
            $fopen = fopen($name, "w");
            fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry));
        }
        zip_entry_close($zip_entry);
    }
    zip_close($zip);
    return true;
}

ソースはこちら

于 2013-08-20T13:46:15.873 に答える
0

問題は解決しました!これが私がしたことです:私はphp.netユーザーコメントからこの関数にzipファイルを作成するコードを変更しました:

function addFolderToZip($dir, $zipArchive){
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            //Add the directory
            $zipArchive->addEmptyDir($dir);
            // Loop through all the files
            while (($file = readdir($dh)) !== false) {
                //If it's a folder, run the function again!
                if(!is_file($dir . $file)){
                    // Skip parent and root directories
                    if(($file !== ".") && ($file !== "..")){
                        addFolderToZip($dir . $file . "/", $zipArchive);
                    }
                }else{
                    // Add the files
                    $zipArchive->addFile($dir . $file);
                }
            }
        }
    }
}
$zip = new ZipArchive;
$zip->open("$modName.zip", ZipArchive::CREATE);
addFolderToZip("$modName/", $zip);
$zip->close();

そして、ホストで、zipファイルを抽出するためにこのコードだけを書きました:

copy($file["tmp_name"], "module/$file[name]");
$zip = new ZipArchive;
if ($zip->open("module/$file[name]") === TRUE) {
    $zip->extractTo('module/');
}
$zip->close();

フォルダーとサブフォルダーが作成されました。残っている唯一のバグは、メイン フォルダー内のすべてのサブフォルダー内のすべてのファイルも抽出するため、サブフォルダー内の各ファイルの 2 つのバージョンが存在することです。

于 2013-08-21T14:51:23.277 に答える