Uložení obrázku do postgres tabulky-položka typu bytea

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mpis
Člen | 65
+
0
-

Už jsem prohledal tuny příspěvků zde i jinde a stále stojím na místě.
Potřebuji uložit obrázek do PG tabulky do položky typu bytea.
Takže mám obrázek v proměnné:

$img = Image::fromFile('images/011.jpg');

a potom ho chci uložit do DB standardním způsobem:

$this->equipmentRepository->updateEquipmentImg($this->equipment_id,
                    $values->img_name,
                    $img);

Následně mi to vyhodí chybu:

Obrázek zařízení se nepodařilo upravit.
SQLSTATE[22021]: Character not in repertoire: 7 ERROR: invalid byte sequence for encoding „UTF8“: 0xff

Když do $img dám krátký string, tak to projde bez chyby.
A s obrázkem to stále háže chybu. Už mám podezření na „něco“ v Nette, protože nechápu, proč se v chybové hlášce objeví to „UTF8“, když chci uložit binární data.

Poradí někdo, prosím, zoufalému začátečníkovi?

honos
Člen | 109
+
0
-

Ja si teda nejsem jisty jestli je to spravne ale co kdybys zkusil $img->getImageResource( );?

RadaR
Člen | 46
+
0
-

Taky jen střelím od boku, ale není třeba data obrázku převést do hexa? Když jsem vkládal obrázky fyzicky do MySQL (i MSSQL) databáze, dělal jsem něco jako:

<?php
$this->equipmentRepository->updateEquipmentImg($this->equipment_id,
                    $values->img_name,
                    '0x'. bin2hex($img));
?>

Editoval RadaR (22. 1. 2014 8:36)

mpis
Člen | 65
+
0
-

RadaR, človeče boží,
Tys to trefil.
Od včera jsem prošel neskutečné množství materiálu, ale ani jeden řádek řešení.
Velké díky.
Teď ještě dodělám zpětné vytažení z DB.
Jo, a ještě se omlouvám za moje podezření na Nette, jelikož toto je problém v PostgreSQL.

EDIT:
Ještě drobné doplnění – je lepší použít toto:

$img = base64_encode($img);
$img = base64_decode($img);

Editoval mpis (22. 1. 2014 13:02)

RadaR
Člen | 46
+
0
-

Myslím, že převodem do base64 si to zbytečně komplikuješ. Nehledě na to, že data převedená do base64 zabírají více místa, než binární data.

Nevyznám se v PostgreSQL, takže nevím, co přesně je datový typ „bytea“, ale řekl bych, že je to typ pro ukládání binárních dat.

Pro zápis dat do tabulky, by tedy mělo stačit poslat data skrze ‚0x‘. bin2hex($data) a pro např. zobrazení obrázku v prohlížeči už nemusíš vůbec nic, jen echo <sloupec_z_databaze> (samozřejmě si musíš poslat příslušné hlavičky, ale to musíš dělat i pokud převádíš data z base64 zpátky na binárky).

Taková je alespoň moje zkušenost.

Editoval RadaR (22. 1. 2014 14:26)

mpis
Člen | 65
+
0
-

Právě že bin2hex to dává dvakrát větší, kdežto base64_encode jen asi 1.33 x větší

honos
Člen | 109
+
0
-

Panove, kdyz ukladam do MySql databaze binarni data tak mam sloupec typu BLOB a do nej ulozim binarni data bez prevodu na hex nebo podobnou …

mpis
Člen | 65
+
0
-

Já ale používám PostgreSQL a položku typu bytea. BLOB je něco úplně jiného.
To už se ale dostáváme do OT. Takže zpět k Nette.

honos
Člen | 109
+
0
-

mpis napsal(a):

Já ale používám PostgreSQL a položku typu bytea. BLOB je něco úplně jiného.
To už se ale dostáváme do OT. Takže zpět k Nette.

Kamarade, to se podle me netyka ale pouze NETTE ale i PHP a POSTGRESQL. Jelikoz sam planuji prechod na POSTGRESQL tak me to celkem zajima jak to vyresis proto bych te chtel poprosit abys v pripade ze to vyresis nasledne napsal jakym zpusobem jsi to poresil. Jinak nasel jsem par odkazu:
http://www.fuzzy.cz/…ql-databaze/ a tento druhy je trochu starsi.. snad ti nektery z nich s tim pomuze. Jinak bych osobne skusil pouzit jak jsem jiz psal tady vraceny gd resource uz by snad sel ulozit, jedna se prec o bin data..

RadaR
Člen | 46
+
0
-

Ano, týká se to obecně databází a prací s daty, ne Nette, takže jsme už všichni poněkud OT :) V zásadě je třeba binární data před uložením do sloupce příslušného typu nějak připravit a to lze za pomocí bin2hex nebo base64_encode.

Jak poslal honos tento link, tak je dole vespod stránky v Image upload library boxu mj. vidět, jak si upravuje data thumbnailu pomocí fce pg_escape_bytea ($thumb_esc = pg_escape_bytea($thumb_string);), aby je mohl následně INSERTnout do tabulky. PHP fce pg_escape_data.

S tím uložením přes vrácený gd resource jsem nikdy nezkoušel, takže nemohu sloužit. Dotaz topicu zněl – jak uložit obrázek do databáze.

Howgh, přestávám tento topic sledovat, myslím, že řešení už je, tak jako tak :)