Uložení obrázku do postgres tabulky-položka typu bytea
- mpis
- Člen | 65
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?
- RadaR
- Člen | 46
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
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
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)
- honos
- Člen | 109
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
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 :)