来自 GitLab 的私人存储库存档(tar.gz),使用 PHP 通过 GitLab 的 API 下载,似乎已损坏 - 校验和无效

Private repository archive(tar.gz) from GitLab, downloaded using PHP via GitLab's API, appears to be corruputed - invalid checksum

我想使用他们的 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),它会正常解压。文件都在那里,我没有收到任何错误 what-so-ever.

我尝试从 GitLab 手动下载存档并使用 PHP 解压缩(我得到了同样的错误)。

我尝试使用终端创建一个 *.tar.gz 文件并使用 PHP 解压它(我没有收到任何错误并且解压正常进行)。

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

我只能假设我是:

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

非常感谢向正确的方向推进。

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

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