PostgreSQL – vložení FileUpload do „bytea“ typu
- Václav Mašín
- Člen | 30
Zdravím,
v rámci jedné předělávky z MySQL do PostgreSQL jsem teď narazil na jeden menší problém. A sice se jedná o vložení binárního obsahu z FileUpload do databáze – klasické vložení stylem
$this->table->insert([
'content' => $values['file']->getContents()
]);
mi po převodu havarovalo s chybou typu: „SQLSTATE[22021]: Character not in repertoire: 7 ERROR: invalid byte sequence for encoding "UTF8“: 0xff"
Problémem se jeví být nastavení typu parametru při volání bindValue() v konstruktoru ResultSet, které tady vyjde na defaultní PDO::PARAM_STR, přičemž ale by tady více žádoucí asi bylo PDO::PARAM_LOB. Alespoň tedy dle https://www.php.net/…pdo.lobs.php.
Jako „workaround“ mi zatím přijde funkční něco jako
$stream = fopen('php://temp', 'r+');
fwrite($stream, $values['file']->getContents());
rewind($stream);
$this->table->insert([
'content' => $stream
]);
což zařídí to žádoucí nastavení typu.
Patrně se tedy nejedná o nějaký kritický problém (pokud vůbec). Jen jsem si říkal, že zkusím téma nadhodit – buď jestli by nemělo na mé straně přímo v aplikaci nějaké lepší řešení, nebo popř. jestli by tady nebyl i nějaký prostor pro zlepšení v Database.
Díky.