がっつりハマりました。
WEBの勉強初めて一番絶望的にわからなかった。
WEBというかDBだったんですが。
RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。しかし、環境によってDBに保存されるデータの形式が変わってしまいます。
QA@ITに質問した後に、キーワードをひねってたら解決策に辿り着いた。
正しいデータ(意図するデータ)
"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b"
問題のデータ
"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."
保存処理のコード
コンソールから再現できたのでその際のコードです(irb)。
file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
image = MiniMagick::Image.read(file)
Master::Image.first.update_attribute(:data, image.to_blob)
上記を実行すると、Master::Image.first.data
に入っているバイナリデータに差異が出ます。
環境の差異
正しいデータとなる環境
ローカルの環境と、AWS上のAmazonLinux(DBとしてRDSを使用)では上手く行きました。
- ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
- AWSのRDS
問題のデータとなる環境
- CentOS6.4
PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit
VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。
解決策
alter role [username] set bytea_output to ‘escape’;
としてやると無事画像データのまま保存されました。
色々と調査するときは冷静に検索キーワードを変えてみることですね。
今回は「postgres bytea activerecord」で引っかかりました。
英語を読めるのは必須ですね。WEB技術は。