PostgreSQL – vložení FileUpload do „bytea“ typu

Václav Mašín
Člen | 26
+
0
-

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“: 0×ff"

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.