1. kntmrkm

    No comment

    kntmrkm
Changes in body
Source | HTML | Preview
@@ -1,61 +1,61 @@
がっつりハマりました。
WEBの勉強初めて一番絶望的にわからなかった。
WEBというかDBだったんですが。
RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。しかし、環境によってDBに保存されるデータの形式が変わってしまいます。
[QA@ITに質問した](http://qa.atmarkit.co.jp/q/3535)後に、キーワードをひねってたら解決策に辿り着いた。
## 正しいデータ(意図するデータ)
`"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b"`
## 問題のデータ
`"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."`
### 保存処理のコード
コンソールから再現できたのでその際のコードです(irb)。
``` 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 byte_output to ‘escape’;`
+- `alter role [username] set bytea_output to ‘escape’;`
としてやると無事画像データのまま保存されました。
色々と調査するときは冷静に検索キーワードを変えてみることですね。
今回は「postgres bytea activerecord」で引っかかりました。
- [ActiveRecord loads binary field incorrectly on Heroku, fine on OSX](http://stackoverflow.com/questions/8539207/activerecord-loads-binary-field-incorrectly-on-heroku-fine-on-osx)
英語を読めるのは必須ですね。WEB技術は。