Autor Zpráva
d-key
Profil
Ahoj,

mám problém s importem fotografií na sreality a zasekl jsem se na něm už docela dlouho, takže bych uvítal, jestli mi někdo může pomoci.

Nabídky normálně importuji na sreality, a poté chci k inzerátu přidat fotky, které mám na serveru nahrané, ale pořád mi to háže chybu, že neposílám data v binary formátu.

Mám to řešeno způsobem:

$img=file_get_contents($url);
$files["data"] = base64_encode($img);

- to mi vypíše, že to není binary formát (i v případě, že ještě provedu $files["data"] = new XML_RPC_Value($files["data"], 'base64');)

Ještě jsem zkoušel druhý způsob, kde jsem jsem vynechal prostřední krok a udělal pouze:

$img=file_get_contents($url);
[pre] $files["data"] = new XML_RPC_Value($img, 'base64');

Což mi vyhodí chybu: Parser error:< Invalid character >

Pokud mi s tím někdo můžete poradit, tak bych byl vděčný.
Jan Tvrdík
Profil
d-key:
Předkládám, že se jedná o import dle specifikace https://admin.sreality.cz/doc/import.pdf. Konkrétně o část 2.7.1 addProjectPhoto.

to mi vypíše, že to není binary formát
Kdo ti to vypíše? A co přesně ti napíše? Dle specifikace žádná taková chyba neexistuje.

Co přesně ti to vrátí, když použiješ
$img = file_get_contents($url);
$files['data'] = new XML_RPC_Value(base64_encode($img), 'base64');
?
d-key
Profil
Jan Tvrdík:
Jedná se pouze o addPhoto, což je víceméně stejný princip.

Tato část kódu:

$img = file_get_contents($url);
$files['data'] = new XML_RPC_Value(base64_encode($img), 'base64');

mi nevrátí nic, ale poté předávám pole $files, kde jsou ještě další hodnoty, do message:

$msg = $this->sendMsg('addPhoto',$newSessionId,$advert_id,"",$files);

A poté, co ji odešlu $response = $client->send($msg); , tak mi to vrátí tu chybu 452: "Attribute 'data' must be binary"
Jan Tvrdík
Profil
d-key:
Kód 452 je v dokumentaci popsaný jako „Nejsou vyplneny vsechny povinne polozky nebo jsou spatneho typu“. Zkontroluj, že jsi vyplnil všechny povinné položky. Konkrétně mi není jasné, proč nemáš vyplněné advert_rkid, přestože dokumentace praví (v kapitole 1.6) „advert_rkid předávám vždy naplněné.“, ač si nejsem jist, zda se to na to vztahuje.

Na fotku dle dokumentace jsou následující požadavky:
• min. rozlišení 480x360
• max. velikost 500kB
• formát jpg, gif nebo png

Pokud to nepomůže, zkus kontaktovat podporu srealit.
d-key
Profil
Jan Tvrdík:
Přidávám zde celou část kódu: (myslím, že to advert_rkid na to nemělo vliv, i když jsem to radši předělal)
              $handle = fopen($url, "rb");
              $contents = fread($handle, filesize($url));
   
              $data =array(
              'data' => new XML_RPC_Value($contents, 'base64'),
              'main' => new XML_RPC_Value(1, 'int'),
              'alt' => new XML_RPC_Value("fotka", 'string'),
              'photo_rkid' => new XML_RPC_Value("100001", 'string')
              );

              $msg = $this->sendMsg('addPhoto',$newSessionId,$advert_id,$id,$data);
              $response = $client->send($msg);

Zkoušel jsem tam dát různé obrázky, u některých, které stále splňují podmínky vstupu mi to navíc vypíše:

Notice: fputs() [function.fputs]: send of 8192 bytes failed with errno=10053 Software v hostitelsk�m po��ta�i ukon�il vytvo�en� p�ipojen�. in C:\Program Files\EasyPHP5.2.10\www\real-smart\admin\xml\RPC.php on line 968
(spíše u větších obrázků).

Nicméně výsledná chyba je teď: XML_RPC_Response Object ( [xv] => [fn] => 2 [fs] => Invalid return payload: enable debugging to examine incoming payload [hdrs] => )

Na podporu srealit jsem psal, ale zatím se mi bohužel neozvali, tak jsem zkusil, jestli mi neproadí někdo tady.
Jan Tvrdík
Profil
d-key:
enable debugging to examine incoming payload
Doplň tam:
$client->setdebug(1);



Přidávám zde celou část kódu
Někde se tam vytratilo volání base64_encode.
d-key
Profil
Jan Tvrdík:
To base64_encode jsem tam teď vynechal, protože v kódu Vojtěcha Dohnala, co jsem našel na http://dohnal.files.wordpress.com/2011/10/sreality_export.pdf , to vůbec není. Zkoušel jsem už několik různých řešení (některá byla s base64_encode, některá bez toho).

jinak ten setdebug(1) jsem nastavil (už jsem to zkoušel i předtím), ale vůbec nevím, co z toho mám vyčíst...

V případě, že tam vrátím to base64_encode, tak mi to vypisuje tu chybu, že data nejsou binary.
Jan Tvrdík
Profil
d-key:
Máš pravdu, to volání base64_encode by tam patřilo, kdybys jako druhý parametr konstruktoru XML_RPC_Value uvedl string. Když uvedeš base64, tak to tu funkci zavolá za tebe.

ten setdebug(1) jsem nastavil (…), ale vůbec nevím, co z toho mám vyčíst
Já taky ne, ale zkusil bych vypsat faultCode, faultString a value.
d-key
Profil
Jan Tvrdík:
Bohužel žádné chybové proměnné se mi nevytvoří. Když si dám print_r (response), tak mi to pouze vypíše:

XML_RPC_Response Object ( [xv] => [fn] => 2 [fs] => Invalid return payload: enable debugging to examine incoming payload [hdrs] => )

Přemýšlel jsem ještě, jestli nemůžu mít nějakou blbou verzi toho XML RPC, což mi ale připadá jako blbost...přece jen mi třeba vkládání nabídek na sreality funguje. Má to jen problém s tou fotkou, se kterou se patlám už týden.

Celkově docela v tom xml tápu, ale myslel jsem, že po rozchození fukce addAdvert, kde jsem se taky zasekl, už mě žádný problém nečeká...a nic :D...myslím, že po vyřešení importu fotek tam snad už nic horšího být nemůže.
Jan Tvrdík
Profil
d-key:
var_dump(XML_RPC_decode($response->value());
d-key
Profil
Jan Tvrdík:
Na to mi to vypíše fatal error:

Fatal error: Call to a member function kindOf() on a non-object in C:\Program Files\EasyPHP5.2.10\www\real-smart\admin\xml\RPC.php on line 1948
Jan Tvrdík
Profil
d-key:
Ty voláš někde metodu kindOf()? A co je ten „non-object“?
d-key
Profil
Jan Tvrdík:
Co jsem pochopil, tak se metoda kindOf volá někde v rámci XML_RPC_decode...já osobně ji nikde nevolám
d-key
Profil
Jan Tvrdík:
Teď jsem to hodil na hosting a vypisuje to úplně jinou chybu:

XML_RPC_Response Object ( [xv] => [fn] => -503 [fs] => Parser error:< Invalid character > [hdrs] => Array ( [0] => HTTP/1.1 200 OK [1] => Content-Type: text/xml [2] => Accept: text/xml, application/x-www-form-urlencoded, application/x-base64-frpc, application/x-frpc [3] => Connection: keep-alive [4] => Content-Length: 298 [5] => Server: Fast-RPC Server Linux ) ) 
d-key
Profil
Jan Tvrdík:
Tak se mi to nakonec podařilo vyřešit tak, že jsem to předělal do této podoby:

$data =array(
              'data' => new XML_RPC_Value($contents,'base64'),
              'main' => new XML_RPC_Value($files["main"],'int')  
              );

              $params = array(new XML_RPC_Value($newSessionId,'string'),new XML_RPC_VALUE($advert_id,'int'),new XML_RPC_VALUE("",'string'),new XML_RPC_VALUE($data,'struct'));
              $msg = new XML_RPC_Message("addPhoto", $params);
              //print_r($msg);
              $response = $client->send($msg);

Už to konečně jede...i tak ale díky za ochotu pomoct

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: