Я пытаюсь отправить фотографию через xml_rpc следующим образом:
$data = array(
'phpads55deb65dd5ca45.43027895',
'aImage' => array(
'filename' => $file['aImage']['name'],
'content' => file_get_contents($file['aImage']['tmp_name']),
),
'campaignId' => 1,
'storageType' => 'web'
);
$this->client = new Client('http://example.com/api/v2/xmlrpc/');
$this->client->call('ox.addBanner', $data);
Я получаю запрос через Fiddler, ведьма показывает это:
POST http://example.com/api/v2/xmlrpc/ HTTP/1.1
Host: example.com
Connection: close
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 771
Accept: text/xml
User-Agent: Zend_XmlRpc_Client
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>ox.addBanner</methodName>
<params>
<param>
<value>
<string>phpads55deb65dd5ca45.43027895</string>
</value>
</param>
<param>
<value>
<struct>
<member><name>campaignId</name><value><int>1</int></value></member>
<member>
<name>bannerName</name>
<value>
<string>khgjjhj</string>
</value>
</member>
<member>
<name>aImage</name>
<value>
<struct>
<member>
<name>filename</name>
<value>
<string>logo.png</string>
</value>
</member>
<member>
<name>content</name>
<value>
<string>�PNG </string>
</value>
</member>
</struct>
</value>
</member>
<member>
<name>comments</name>
<value>
<string>dfgdgdfgdfg</string>
</value>
</member>
<member>
<name>storageType</name>
<value>
<string>web</string>
</value>
</member>
</struct>
</value>
</param>
</params></methodCall>
И, как вы можете видеть, полного изображения нет в запросе. В чем проблема? Я тестировал fread
вместо file_get_content
но нет никакой разницы. XML Parser отправляет эту ошибку:
Ошибка XML: недопустимый символ в строке 2
Формат значения неверен. Мне пришлось изменить эту строку
'content' => file_get_contents($file['aImage']['tmp_name']),
в
'content' => new Base64(file_get_contents($file['aImage']['tmp_name'])),
который необходимо импортировать
use Zend\XmlRpc\Value\Base64;
Вы не можете вставлять двоичный контент, подобный этому в ответе XML. Вы должны рассмотреть базовую 64, кодирующую двоичное изображение, в строку базы 64. Вы можете сделать так:
$filename = $file['aImage']['tmp_name'];
$data = file_get_contents($filename);
$base64 = base64_encode($fileData);
$data = array(
'phpads55deb65dd5ca45.43027895',
'aImage' => array(
'filename' => $filename,
'content' => $base64
),
'campaignId' => 1,
'storageType' => 'web'
);