OK、nobody
ユーザーの問題を解決しました。私はすべての回避策を説明しようとします。
@マイクブラントの答え
Mikeは、chown()関数のオーバーライドextractTo()
メソッドを利用することを提案しました。まあ、それを喜んでする前に、私はchown()
常にスタンドアロンで関数をテストし、エラーを出力しました:
ストリームの作成に失敗しました:アクセスが拒否されました...
主要な共有ホスティングではchownが機能しないようです
FTP機能
それで、FTP functions
私は、少なくとも今のところxDで、正常に動作するスクリプトを作成したとはいえ、続けます。これは、スクリプトが1つのzipファイルに対して行うことの履歴書です。
- を使用して一時ファイルを作成します
tmpfile()
。
ftp_fput()
一時ファイルをzipファイルとともに現在のディレクトリに配置するために使用します。
ftp_site
およびを使用して書き込み権限を付与しCHMOD 0777
ます。
- でzipファイルの内容を読み取ります
$content = $zip->getFromName('zipped-file.txt');
。
- を使用してコンテンツを新しいファイルに配置し
fputs($fp, $content);
ます。
- 接続を閉じる
以下のコードは、完全なプロセスを示しています
$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ファイルが「ディレクトリ」であるか「ファイル」であるかを認識できないため、これはより複雑なカスタマイズを開始するための最初のステップです。