2015-04-07 109 views
0

我想使用他们的API下载私人GitLab存档库存档。我使用PHP和cURL来做到这一点。我可以使用以下代码:来自GitLab的私有存储库存档(tar.gz),通过GitLab的API使用PHP下载,似乎被侵蚀 - 无效校验和

$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. 内容类型:应用程序/ octet-stream
    2. Content-Type:application/x-tar
    3. Content-Transfer-Encoding:binary ...等等。当使用二进制头时,我把内容放入的文件被设置为'wb'。但是,没有运气。

而且最后可能是因为他们的API可能无法正常工作,但我对此表示怀疑。

而且在正确的方向微调是非常感谢。

回答

2

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

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

+0

好的,那么我的选择是什么?我正在使用'当前PHP版本:5.5.9-1ubuntu4.7'。从我得到的错误消息中,这与错误链接中发布的错误消息完全相同,似乎没有正确固定(?)。 [email protected]表示应该在'd380d1cb1ba48c41682f749692b78a10e91dd070(5.5.24 +)中修复''我使用的是GitLab,而不是Hub,但我认为他们使用的是相同的代码库。 – Andrew

+0

升级到5.5.24,使用'system'调用或使用Pear的'Archive_Tar' –

+0

我正在使用5.5.9,正如我上面所说的。愚蠢的问题,是默认情况下在PHP中包含Archive_Tar还是我需要安装它? – Andrew

相关问题