簡體   English   中英

從PHP Web服務創建的壓縮zip文件中提取xml文件時出錯

[英]Error when extracting xml file from compresed zip file created by PHP web service

我已經在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文件的內容時出現問題。 由於此函數$res=$zip->open($zip_file);導致出現錯誤19(不是zip存檔$res=$zip->open($zip_file); 手動提取文件也一樣 在此處輸入圖片說明

除了使用7-zip解壓縮外,我沒有任何錯誤。

在此代碼中:

$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注釋為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文件已損壞。 7zip嘗試(並成功)找到正確的值,但是ZipArchive和Windows壓縮文件夾似乎沒有這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM