解压缩的文件更改所有者,PHP

时间:2012-12-18 00:32:41

标签: php unzip ziparchive file-ownership

我有一个zip文件到这样的目录:

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

当我使用ZipArchive类解压缩文件时,所有上传的文件都是nobody用户的所有者。有没有办法避免这个所有者改变?

  1. 如果需要,我可以使用ftp(仅限salome用户)。
  2. 此脚本最终将在多个主机上共享,因此我们的想法是尽可能保持通用。

2 个答案:

答案 0 :(得分:2)

您可以考虑扩展zipArchive类并覆盖extractTo方法,以便对目录中的文件执行chown()

根据您在评论中讨论的用例,您可能还需要考虑使用Phar存档格式。 php.net/manual/en/intro.phar.php

Phar将允许您的模块提交者提交您可能根本不需要提取的可执行PHP代码的文件文件。

答案 1 :(得分:0)

好的,我已经解决了nobody用户的问题。我将尝试解释我的所有解决方法。

@Mike Brant的回答

Mike建议我使用chown()函数重写extractTo()方法。好吧,在愿意使用它之前,我经常测试chown()函数独立它打印错误:

  

无法创建流:在...中拒绝权限

看起来chown不适用于主要的共享主机

FTP功能

所以,继续我,虽然FTP functions我制作了一个工作正常的脚本,至少现在是xD。这是脚本为一个压缩文件执行的简历:

  1. 使用tmpfile()创建临时文件。
  2. 使用ftp_fput()将临时文件放在包含压缩文件的当前目录中。
  3. 使用ftp_siteCHMOD 0777提供写入权限。
  4. 使用$content = $zip->getFromName('zipped-file.txt');
  5. 阅读压缩文件内容
  6. 使用fputs($fp, $content);将内容放入新文件。
  7. 关闭连接
  8. 以下代码说明了完整的流程

    $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();
    }
    

    这是开始更复杂的自定义的第一步,因为上面的代码无法知道压缩文件是“目录”还是“文件”。