[英]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.