2

次のようなディレクトリにzipファイルがあります。

drwxr-xr-x 2 salome  salome  4096 Dec 16 17:41 staff.zip

ZipArchiveクラスでファイルを解凍すると、解凍されたすべてのファイルはユーザーによって所有されnobodyます。この所有者の変更を回避する方法はありますか?

  1. 必要に応じて ftp を使用できます (salome ユーザーとしてのみ)。
  2. このスクリプトは最終的に複数のホストで共有されるため、可能な限り一般的なものにするという考え方です。
4

2 に答える 2

2

クラスを拡張し、メソッドをzipArchiveオーバーライドして、ディレクトリ内のファイルに対しても実行することを検討してください。extractTochown()

コメントで説明した使用例に基づいて、Phar アーカイブ形式の使用を検討することもできます。php.net/manual/en/intro.phar.php

Phar を使用すると、モジュールのサブミッターは、まったく抽出する必要のない実行可能な PHP コードのファイル ファイルをサブミットできます。

于 2012-12-18T00:37:56.230 に答える
0

OK、nobodyユーザーの問題を解決しました。私はすべての回避策を説明しようとします。

@マイクブラントの答え

Mikeは、chown()関数のオーバーライドextractTo()メソッドを利用することを提案しました。まあ、それを喜んでする前に、私はchown()常にスタンドアロンで関数をテストし、エラーを出力しました:

ストリームの作成に失敗しました:アクセスが拒否されました...

主要な共有ホスティングではchownが機能しないようです

FTP機能

それで、FTP functions私は、少なくとも今のところxDで、正常に動作するスクリプトを作成したとはいえ、続けます。これは、スクリプトが1つのzipファイルに対して行うことの履歴書です。

  1. を使用して一時ファイルを作成しますtmpfile()
  2. ftp_fput()一時ファイルをzipファイルとともに現在のディレクトリに配置するために使用します。
  3. ftp_siteおよびを使用して書き込み権限を付与しCHMOD 0777ます。
  4. でzipファイルの内容を読み取ります$content = $zip->getFromName('zipped-file.txt');
  5. を使用してコンテンツを新しいファイルに配置しfputs($fp, $content);ます。
  6. 接続を閉じる

以下のコードは、完全なプロセスを示しています

$zip = new ZipArchive;
$ftp_path_to_unzip = '/public_html/ejemplos/php/ftp/upload/';
$local_path_to_unzip = '/home/user/public_html/ejemplos/php/ftp/upload/';

if ($zip->open('test.zip') == TRUE) {
    
    //connect to the ftp server
    $conn_id = ftp_connect('ftp.example.com');
    $login_result = ftp_login($conn_id, 'user', 'password');    
    
    //if the connection is ok, then...
    if ($login_result) {
        
        //iterate each zipped file
        for ($i = 0; $i < $zip->numFiles; $i++) {
            $filename = $zip->getNameIndex($i);
            
            //create a "local" temp file in order to put it "remotely" in the same machine
            $temp = tmpfile();
            
            //create the new file with the same name from the extracted file in question
            ftp_fput($conn_id, $ftp_path_to_unzip . $filename, $temp, FTP_ASCII);
            
            //set write permissions, eventually we will put its content
            ftp_site($conn_id, "CHMOD 0777 " . $ftp_path_to_unzip . $filename);
            
            //open the new file that we have created
            $fp = fopen($local_path_to_unzip . $filename, 'w');
            
            //put the content from zipped file
            $content = $zip->getFromName($filename);
            fputs($fp, $content);
            
            //close the file
            fclose($fp);
            
            //now only the owner can write the file
            ftp_site($conn_id, "CHMOD 0644 " . $ftp_path_to_unzip . $filename);
            
        }
    }
    
    // close the connection and the file handler
    ftp_close($conn_id);
    
    //close the zip file
    $zip->close();
}

上記のコードでは、zipファイルが「ディレクトリ」であるか「ファイル」であるかを認識できないため、これはより複雑なカスタマイズを開始するための最初のステップです。

于 2012-12-18T16:53:03.810 に答える