我已经用PHP创建了Web服务(客户端)(使用SOAP协议),可以为需要接收消息的用户下载ID列表。
现在他们已经改变了提供ID列表的系统(在服务器端)。他们在7个文件中拆分了超过200000个ID的xml列表,并将它们编码为base64并压缩为zip文件。我已经设法通过我的PHP客户端下载每个文件,从base64解码它们,然后我创建了UTF-8 zip文件并在其中编写了消息内容,正如您在我的脚本中看到的那样:
<?php
$obj = array('PinsCcIdsAsXmlZipBase64' => "", 'EmptyPage' => FALSE);
$PageNum=0;
while(!$obj['EmptyPage']){
$obj=Send_SOAP_mssg($TipPoruke,$SERVICE_TEST,$SOAP_cert,$NAMESPACE_URI,$cert_password,$ServiceId,$PageNum,$obj);
$zip_file=$OIB_path . 'PinListOfUsersThatDontHavePersonalization' . $PageNum . '.zip';
$f=fopen($zip_file,"wb")or die("Unable to open file!");
# Now UTF-8 - Add byte order mark
fwrite($f, pack("CCC",0xef,0xbb,0xbf));
fwrite($f,$obj['PinsCcIdsAsXmlZipBase64']);
fclose($f);
$zip = new ZipArchive;
$res = $zip->open($zip_file);
if ($res === TRUE) {
$zip->extractTo("C:\\xampp\\htdocs\\NIAS\\OIB\\");
$zip->close();
echo 'Success!';
} else {
echo 'ERROR! ' . $res ;
}
$PageNum++;
}
function Send_SOAP_mssg($TipPoruke,$SERVICE_TEST,$SOAP_cert,$NAMESPACE_URI,$cert_password,$ServiceId,$PageNum,$obj){
$client->__getLastRequest();
$xml=$client->__getLastResponse();
$doc = new DOMDocument();
$doc->loadXML( $xml );
$SOAPRequest = $doc->getElementsByTagName( "EmptyResultSet" );
if ($SOAPRequest->length!=0){
$obj['EmptyPage'] = TRUE;
return $obj;
}
else{
$SOAPRequest = $doc->getElementsByTagName( "PinsCcIdsAsXmlZipBase64" );
$obj['PinsCcIdsAsXmlZipBase64'] .= base64_decode($SOAPRequest->item(0)->nodeValue);
$obj['EmptyPage'] = FALSE;
return $obj;
}
}
?>
当我尝试提取zip文件的内容时出现问题。由于此功能,我收到错误19(不是zip存档)
$res=$zip->open($zip_file);
。
手动提取文件也是如此
除了用7-zip提取它,然后我没有错误。
答案 0 :(得分:2)
在此代码中:
$obj['PinsCcIdsAsXmlZipBase64'] .= base64_decode($SOAPRequest->item(0)->nodeValue);
// ...
# Now UTF-8 - Add byte order mark
fwrite($f, pack("CCC",0xef,0xbb,0xbf));
fwrite($f,$obj['PinsCcIdsAsXmlZipBase64']);
base64_decode
为您提供二进制结果,此压缩内容。 Now UTF-8
注释为false:您有一个二进制字符串,即实际的zip文件。您无需添加BOM:
$ php -a
Interactive shell
php > $content = base64_decode("UEsDBAoAAAAAADiaeEkAAAAAAAAAAAAAAAAFABwAYS50eHRVVAkAA8suN1jLLjdYdXgLAAEE6AMAAAToAwAAUEsBAh4DCgAAAAAAOJp4SQAAAAAAAAAAAAAAAAUAGAAAAAAAAAAAAKSBAAAAAGEudHh0VVQFAAPLLjdYdXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEASwAAAD8AAAAAAA==");
php > $f=fopen("a.zip","wb");
php > fwrite($f,$content);
php > fclose($f);
这给了我一个正确的zip文件。
zip文件使用偏移量来查找其内部结构。如果你预先添加字节,这些偏移现在是错误的:你有一个损坏的zip文件。 7zip尝试(并成功)找到正确的值,但ZipArchive
和Windows压缩文件夹似乎没有这样做。