来自GitLab的私有仓库存档(tar.gz),通过GitLab的API使用PHP下载,似乎被篡改 - 无效的校验和



我想使用他们的API下载一个私有的GitLab存储库存档。我使用PHP和cURL来实现这一点。我可以使用以下代码做到这一点:

$ch = curl_init(http://example.com/api/v3/projects/64/repository/archive?private_token=private_token_goes_here);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$output = curl_exec($ch);
$fh = fopen("out.tar.gz", 'w');
fwrite($fh, $output);
fclose($fh);

代码本身并不复杂,也很标准。

我面临的问题是,一旦我尝试打开包装,使用以下代码:

    // decompress from gz
    $p = new PharData($temp_archive . '.tar.gz');
    $p->decompress($temp_archive . '.tar');
    // unarchive from the tar
    $phar = new PharData($temp_archive . '.tar');
    $phar->extractTo($extract_path);

我收到以下错误:

Fatal error: Uncaught exception 'UnexpectedValueException' with message ' in phpfile.php on line 294
UnexpectedValueException: phar error: "path/to/downloaded/archive/temp_archive.tar.gz" is a corrupted tar file (checksum mismatch of file "52 comment=01607149cd460cba6f1ac3003bb7b0c9cb0e2b94
") in phpfile.php on line 294

是的,这就是全部错误,我没有删掉错误信息。'是错误消息。

下载文件的校验和确实无效。经过几个小时的谷歌搜索和论坛浏览,我又回到了原点。我不知道它怎么了。

如果我使用终端解开档案(我使用的是MAC OS Build 12E55),它会正常解压缩。文件都在那里,我从来没有收到任何错误。

我尝试从GitLab手动下载档案,并使用PHP对其进行解包(我得到了同样的错误)。

我尝试使用终端创建一个*.tar.gz文件,并使用PHP对其进行解包(我没有收到任何错误,解包过程正常)。

我尝试上传一个使用终端创建的文件,并使用PHP下载,之后我再次使用PHP对其进行解包,没有收到任何错误。

我只能假设我是:

  • 未正确使用API
  • 没有设置正确的标题-尽管我尝试过设置:
    1. 内容类型:应用程序/八位字节流
    2. 内容类型:application/x-tar
    3. 内容传输编码:二进制。。。等等。当使用二进制标头时,我放入内容的文件被设置为'wb'。不过,运气不好

最后,他们的API可能不能正常工作,尽管我对此表示怀疑

我们非常感谢你朝着正确的方向努力。

这似乎是最近才修复的PharData类实现中的一个错误,请参阅https://bugs.php.net/bug.php?id=64343.

因此,Github似乎对tar文件使用pax格式,而不是ustar格式。有关tar格式的说明,请参阅:https://github.com/libarchive/libarchive/wiki/FormatTar

最新更新