来自 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
- 没有设置正确的 headers - 尽管我曾尝试设置:
- Content-Type: application/octet-stream
- Content-Type: application/x-tar
- Content-Transfer-Encoding:二进制...等等。使用二进制 header 时,我将内容放入的文件被设置为
'wb'
。还是不走运。
最后可能是他们的 API 可能无法正常工作,尽管我对此表示怀疑。
非常感谢向正确的方向推进。
这似乎是 PharData
class 实现中的一个错误,最近才修复,请参阅 https://bugs.php.net/bug.php?id=64343。
所以 Github 似乎对 tar 文件使用 pax
格式,而不是 ustar
格式。有关 tar
格式的说明,请参阅:https://github.com/libarchive/libarchive/wiki/FormatTar
我想使用他们的 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
- 没有设置正确的 headers - 尽管我曾尝试设置:
- Content-Type: application/octet-stream
- Content-Type: application/x-tar
- Content-Transfer-Encoding:二进制...等等。使用二进制 header 时,我将内容放入的文件被设置为
'wb'
。还是不走运。
最后可能是他们的 API 可能无法正常工作,尽管我对此表示怀疑。
非常感谢向正确的方向推进。
这似乎是 PharData
class 实现中的一个错误,最近才修复,请参阅 https://bugs.php.net/bug.php?id=64343。
所以 Github 似乎对 tar 文件使用 pax
格式,而不是 ustar
格式。有关 tar
格式的说明,请参阅:https://github.com/libarchive/libarchive/wiki/FormatTar