[Rails]Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-8

problam:

最近在跑一個第三方的API,在post資料過去後,對方會打5~7次的post callback回來,並且每一次夾帶著一個記錄著片段PDF的tempfile,我需要讀取每一次tempfile的binary並且跟上一次的binary做concat然後存在postgrasql database裡(Column type is binary),最後再讀出來寫成PDF file。
但在concat binary string的時候出現 Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-8 的error,下面是片段的code

data = IO.read(params[:file].tempfile.path)
my_model.pdf_data << data #=> raise error

solution

寫入時使用 escape_bytea method

my_model.pdf_data << ActiveRecord::Base.connection.escape_bytea(data)

剛剛有說到最後需要把database裡的binary撈出來然後寫成PDF file,這邊也有遇到另一個問題是如果只是單純的把資料讀出來寫成file的話,會造成檔案毀損錯誤無法讀取,這時候就要使用 unescape_bytea 方法把binary讀出來

 f = File.new("public/test.pdf", "w+b")
 f.write ActiveRecord::Base.connection.unescape_bytea(my_model.pdf_data)
 f.close

Referance

Storing binary objects in postgres using Ruby on Rails

comments powered by Disqus