2016-11-24 22 views
1

我已經在PHP(使用SOAP協議)中創建Web服務(客戶端),該服務爲需要接收消息的用戶下載ID的列表。從PHP Web服務創建的壓縮zip文件中提取xml文件時出錯

現在他們已經改變了傳遞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; 
    } 
} 
?> 

當我嘗試提取壓縮文件的內容時發生問題。由於此功能,我得到錯誤19(不是zip存檔) $res=$zip->open($zip_file);。 手動解壓縮文件也是一樣 enter image description here

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

回答

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給你一個二進制結果,這個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壓縮文件夾似乎沒有這樣做。

相關問題