从PHP Web服务

时间:2016-11-24 09:13:43

标签: php xml web-services soap zip

我已经用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);。 手动提取文件也是如此 enter image description here

除了用7-zip提取它,然后我没有错误。

1 个答案:

答案 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压缩文件夹似乎没有这样做。