【问题标题】:Need PHP script to decompress and loop through zipped file需要 PHP 脚本来解压并循环通过压缩文件
【发布时间】:2011-02-05 16:55:43
【问题描述】:

我正在使用一个相当简单的脚本来打开和解析几个 gzip 压缩的 xml 文件。我还需要对 ZIP 文件执行相同的基本操作。看起来应该很简单,但我无法在任何地方找到看起来像等效的代码。

这是我已经在做的简单版本:

$import_file = "source.gz";

$sfp = gzopen($import_file, "rb");  /////  OPEN GZIPPED data
while ($string = gzread($sfp, 4096)) {    //Loop through the data

    /// Parse Output And Do Stuff with $string
}
gzclose($sfp);      

对于压缩文件有什么相同的作用?

【问题讨论】:

    标签: php zip unzip


    【解决方案1】:

    如果您的 PHP 5 >= 5.2.0,PECL zip >= 1.5.0,那么您可以使用 ZipArchive 库:

    $zip = new ZipArchive; 
    if ($zip->open('source.zip') === TRUE) 
    { 
         for($i = 0; $i < $zip->numFiles; $i++) 
         {   
            $fp = $zip->getStream($zip->getNameIndex($i));
            if(!$fp) exit("failed\n");
            while (!feof($fp)) {
                $contents = fread($fp, 8192);
                // do some stuff
            }
            fclose($fp);
         }
    } 
    else 
    { 
         echo 'Error reading zip-archive!'; 
    } 
    

    【讨论】:

    • thetaiko - 这正是我所需要的。谢谢。但是,您需要纠正两个小错误。 "for" 循环的 closign 括号丢失,并且 fread 还需要一个长度参数。修复这两个,它就像一个魅力。它也适用于 HTTP 和 FTP 连接吗?如果是这样,您是否也可以将用户名和密码传递给它。再次感谢,吉姆
    • 嗯,不确定您所说的在 HTTP 和 FTP 连接上工作的确切含义。我想你可以通过任何路径,但我没有尝试过。不要将“source.zip”传递给$zip-&gt;open(),试试这个:$zip-&gt;open('http://some.url.com/source.zip');
    • 有机会我会试试的。如果可行,我的下一个问题是当您想通过 ftp 连接时如何传递用户名和密码。但我的猜测是它不允许这样做。这会让我的生活变得太容易了。
    • 其实我觉得一般可以这样传递用户名和密码:ftp://username:password@some.server.com/path
    【解决方案2】:

    ZipArchive 是一种聪明的方法。您可以使用带有ZipArchive::statIndex()for 循环来获取您需要的所有信息。您可以通过索引 (ZipArchive::getFromIndex()) 或名称 (ZipArchive::getFromName()) 访问文件。

    例如:

    function processZip(string $zipFile): bool
    {
        $zip = new ZipArchive();
        if ($zip->open($zipFile) !== true) {
            echo '<p>Can\'t open zip archive!</p>';
            return false;
        }
    
        // As long as statIndex() does not return false keep iterating
        for ($idx = 0; $zipFile = $zip->statIndex($idx); $idx++) {
            $directory = \dirname($zipFile['name']);
    
            if (!\is_dir($zipFile['name'])) {
                // file contents
                $contents = $zip->getFromIndex($idx);
            }
        }
        $zip->close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多