【问题标题】:Error when extracting xml file from compresed zip file created by PHP web service从 PHP Web 服务创建的压缩 zip 文件中提取 xml 文件时出错
【发布时间】:2017-04-08 12:07:41
【问题描述】:

我在 PHP(它使用 SOAP 协议)中创建了 Web 服务(客户端),它为想要接收消息的用户下载 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-&gt;open($zip_file);。 手动提取文件也是如此

除了用 7-zip 解压,我没有错误。

【问题讨论】:

    标签: php xml web-services soap zip


    【解决方案1】:

    在这段代码中:

    $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 给你一个二进制结果,这个 zip 内容。 Now UTF-8 注释是错误的:您有一个二进制字符串,即实际的 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 压缩文件夹似乎没有这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多