我有一个zip文件到这样的目录:
drwxr-xr-x 2 salome salome 4096 Dec 16 17:41 staff.zip
当我使用ZipArchive类解压缩文件时,所有上传的文件都是nobody
用户的所有者。有没有办法避免这个所有者改变?
答案 0 :(得分:2)
您可以考虑扩展zipArchive
类并覆盖extractTo
方法,以便对目录中的文件执行chown()
。
根据您在评论中讨论的用例,您可能还需要考虑使用Phar存档格式。 php.net/manual/en/intro.phar.php
Phar将允许您的模块提交者提交您可能根本不需要提取的可执行PHP代码的文件文件。
答案 1 :(得分:0)
好的,我已经解决了nobody
用户的问题。我将尝试解释我的所有解决方法。
Mike建议我使用chown()函数重写extractTo()
方法。好吧,在愿意使用它之前,我经常测试chown()
函数独立它打印错误:
无法创建流:在...中拒绝权限
看起来chown不适用于主要的共享主机
所以,继续我,虽然FTP functions
我制作了一个工作正常的脚本,至少现在是xD。这是脚本为一个压缩文件执行的简历:
tmpfile()
创建临时文件。ftp_fput()
将临时文件放在包含压缩文件的当前目录中。ftp_site
和CHMOD 0777
提供写入权限。$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();
}
这是开始更复杂的自定义的第一步,因为上面的代码无法知道压缩文件是“目录”还是“文件”。