繁体   English   中英

下载和解压缩zip文件的脚本会返回错误

[英]Script to download and extract zip files returns errors

嘿大家,我编写了一个从远程源下载zip文件的脚本,然后应该将zip文件解压缩到一个目录。 以下是脚本:

    <?php
        $url = "http://example.com/some_file.zip";
        download($url,'file.zip');

        function download($url,$file_name = NULL){
          if($file_name == NULL){ $file_name = basename($url);}

          $url_stuff = parse_url($url);
          $port = isset($url_stuff['port']) ? $url_stuff['port'] : 80;

          $fp = fsockopen($url_stuff['host'], $port);
          if(!$fp){ return false;}

          $query  = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n";
          $query .= 'Host: ' . $url_stuff['host'];
          $query .= "\n\n";

          fwrite($fp, $query);

          while ($tmp = fread($fp, 8192))   {
            $buffer .= $tmp;
          }

          preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
          $file_binary = substr($buffer, - $parts[1]);
          if($file_name == NULL){
            $temp = explode(".",$url);
            $file_name = $temp[count($temp)-1];
          }
          if(!file_exists("packages")){ mkdir("packages", 0755);}
          $file_open = fopen("packages/" . $file_name,'w');
          if(!$file_open){ return false;}
          fwrite($file_open,$file_binary);

          $zip = zip_open(realpath("packages")."/".$file_name);
          if ($zip) {
            while ($zip_entry = zip_read($zip)) {
              $fp = fopen("some_dir/".zip_entry_name($zip_entry), "w");
              if(zip_entry_open($zip, $zip_entry, "r")) {
                $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                fwrite($fp,"$buf");
                zip_entry_close($zip_entry);
                fclose($fp);
              }
            }
            zip_close($zip);
          }
          fclose($file_open);
          return true;
        }
   ?>

我遇到的问题是,虽然远程文件的下载工作完美无缺,但我似乎无法提取它。 zip_read()zip_close()返回错误,说它“期望参数1是资源,给定整数......”,我发现这意味着zip_open()无法提取并返回错误代码,我发现“19”表示“Zip文件功能错误:不是zip存档”。 但是,我知道我下载的文件实际上是一个zip文件。 谁能解释这种奇怪的行为并提供修复? 非常感谢!

引用php.net:“zip_open()...返回一个资源句柄,供以后与zip_read()和zip_close()一起使用,或者如果filename不存在或者出现其他错误,则返回错误数。”

这意味着您无法测试if ($zip) 尝试

if ( is_resource($zip) ) {
    // stuff
} else {
    print "Zip_open() returned error $zip\n";
}

编辑:除此之外,您需要正确地分为两部分。 您在很大程度上依赖于Content-Length参数。 您不检查preg_match实际匹配。 很多事情都可能出错,你应该检查一下。 尝试在第一个空行上拆分内容(在\\r\\n\\r\\n或类似的东西上explode

除了fread()循环应检查feof() ,因为如果由于某种原因你会遇到一个空的读取,你现在会停止读取。 从php.net复制并粘贴:

while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}

但我们可以继续这里。 必须提出三个要点:

  • 阅读神奇的手册(php.net)
  • 检查返回值
  • 不要以为你知道你不知道的事情

这些是相关的:您必须查找手册以查看可能遇到的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM