2016-08-24 31 views
2

我有一个PHP数组,其中包含字节,实际字节代表一个ZIP文件(其中包含ZIP中的多个文件)。PHP的字节数组到Zip文件

这是从第三方API返回的,所以我别无选择,只能使用此格式。

所以我想把它转换成ZIP文件。字节数组的

例通过API返回:

[bytes] => Array 
      (
       [0] => 37 
       [1] => 80 
       [2] => 68 
       [3] => 70 
       [4] => 45 
       [5] => 49 
       [6] => -46 
... continues to close to 20,000 
) 

我试图仅仅让浏览器通过创建一个完整的字节串,并适应浏览器标题...返回它:

foreach($bytes as $byte) 
{ 
    $byteString .= $byte; 
} 
header("Content-type: application/zip"); 
header("Content-Disposition: inline; filename='test.zip'"); 
echo $byteString; 

这确实会创建一个zip文件,但它无效/损坏。

我也试过这个,我发现其他地方#2:

$fp = fopen('/myfile.zip', 'wb+'); 

while(!empty($bytes)) { 
    $byte1 = array_shift($bytes); 
    $byte2 = array_shift($bytes); 
    if(!$byte2) { 
     $byte2 = 0; 
    } 
fwrite($fp, pack("n*", ($byte1 << 8) + $byte2)); 
} 
close($fp); 

但同样,在创建ZIP,但它是无效的/损坏。

任何指针,最感谢。

感谢

+0

它似乎极有可能使用此API错误。 – 2016-08-24 00:48:38

+0

“看起来你使用这个API的可能性很大。” - 不,我希望我能想到!这是一个自定义的API,这确实是如何设置的。 – user1513196

回答

1

使用ASCII表可以很容易地您收到的数据进行解码的帮助下,你会发现它与

%PDF 

这意味着,返回的数据是开始PDF格式,不是zip。 Zip文件以PK开头,该格式的发明者的缩写是Phil Katz

作为一般说明,了解常见的file type signatures非常有用,可以为您节省大量时间。

+0

尽管API文档明确指出它会返回一个ZIP,但它确实是一个PDF。使用第二个代码示例,并将文件扩展名更改为.pdf,最终生成一个有效的PDF。然而,PDF的内容是空白的,但它具有诸如方向和大小的元数据,所以实际的“内容”缺失必须与实际的字节数据相关。谢谢你的帮助 – user1513196