我想使用他们的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
- 没有设置正确的标题-尽管我尝试过设置:
- 内容类型:应用程序/八位字节流
- 内容类型:application/x-tar
- 内容传输编码:二进制。。。等等。当使用二进制标头时,我放入内容的文件被设置为
'wb'
。不过,运气不好
最后,他们的API可能不能正常工作,尽管我对此表示怀疑
我们非常感谢你朝着正确的方向努力。
这似乎是最近才修复的PharData
类实现中的一个错误,请参阅https://bugs.php.net/bug.php?id=64343.
因此,Github似乎对tar文件使用pax
格式,而不是ustar
格式。有关tar
格式的说明,请参阅:https://github.com/libarchive/libarchive/wiki/FormatTar