2015-02-26 2 views
2

Я должен отправить файл в WSDL, элемент описан в WSDL, как:Отправка Zip файлов через SOAP в PHP

<s:element minOccurs="0" maxOccurs="1" name="theZipFile" type="s:base64Binary" /> 

Как я могу отправить файл Zip, используя SOAP клиент? Я пробовал следующее:

$client = new SoapClient($url); 
$params = array("theZipFile" => "file.zip"); 
$response = $client->theFunction($params); 

Но я не получаю ожидаемого ответа. Я попытался использовать .Net и C# со следующим кодом:

string filename = "file.zip"; 
FileInfo fi = new FileInfo(filename); 
long numBytes = fi.Length; 
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); 
BinaryReader br = new BinaryReader(fs); 
byte[] data = br.ReadBytes((int)numBytes); 
br.Close(); 
fs.Close(); 

XElement response = client.theFunction(data); 

И он работает без проблем.

Спасибо!

+1

Где вы конвертируете поток байтов в базу 64 и проверили ли вы, что почтовый файл, отправленный в рабочий код, все еще можно открыть? Я думаю, что .NET автоматически преобразуется в base64 в отличие от PHP, где вам придется делать это вручную. –

+1

Это должно помочь http://stackoverflow.com/questions/35879/base64-encoding-image –

ответ

1

SoapClient не отправлял правильный XML по какой-то странной причине, по-видимому, был проблемой с определением.

Изменено для использования CURL.

function SOAPRawRequest($url, $postString, &$error) { 
    $soap_do = curl_init(); 
    curl_setopt($soap_do, CURLOPT_URL,   $url); 
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($soap_do, CURLOPT_TIMEOUT,  10); 
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($soap_do, CURLOPT_POST,   true); 
    curl_setopt($soap_do, CURLOPT_POSTFIELDS, $postString); 
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,  
    array('Content-Type: text/xml; charset=utf-8', 
     "Accept: text/xml", 
     "Cache-Control: no-cache", 
     "Pragma: no-cache", 
     "SOAPAction: \"http://tempuri.org/theFunction\"", 
     'Content-Length: '.strlen($postString) 
    )); 

    $result = curl_exec($soap_do); 
    $error = curl_error($soap_do); 

    return $result; 
} 

Также изменен $params = array("theZipFile" => "file.zip"); к:

$content = file_get_contents("file.zip"); 
$content64 = base64_encode($content); 
+0

Так было ли это изменение в CURL или фактическое кодирование байтов на base64? Кажется, что исходный код отправил бы исходный двоичный код, который уничтожил бы/аннулировал бы ваш XML. –

+0

base64_encode был правильным ответом – JohnnyAce

1

Вы передаете имя файла вместо содержимого файла для вызова мыла. Использовать

$params = array("theZipFile" => base64_encode(file_get_contents('path/to/a/file.zip'))); 
Смежные вопросы