Webサービスを作って潰すのが趣味な人のブログ

とりあえず作ってから怒られよう

【Rails3.x】自前でファイルアップロードした時に発生する「\x89′ from ASCII-8BIT to UTF-8」エラーを回避する方法

http://www.flickr.com/photos/56801363@N04/10058897163

photo by Giuseppe Martino™

※過去記事のサルベージです、現在は状況が違っているかもしれません

 

Railsにはファイルをアップロードが出来るgemが多数存在します。有名所であればcarrierwaveやpaperclipなどなど……しかし!どうしても自前で実装しなければならない時が漢にはあるんです。

そんな時に踏みがちなエラー”‘\x89′ from ASCII-8BIT to UTF-8″の回避方法についてメモしておきます。

 

View側

適当ですがフォーム側は恐らくこんな感じでしょう

gist3c5137c42809b3cc21bd

これでファイルを選択して送信するだけ、簡単ですね

 

Controller側

問題はこっち、素直にこんな感じで保存したいところなんですが……

gistae962464f1ef23b03832

これをやると「‘\x89′ from ASCII-8BIT to UTF-8″」という例外が発生してしまいます

 

なんでだろうなーって考えてみたんですけど、どうやらバイナリじゃなくて文字列として受け取ってしまっているのが原因のようです

Railsでは飛んできた値を全て文字列にして取得するので(params[:file])というバイナリファイルを勝手に文字列として読みこんだ上に「これUTF8じゃねーぞ!」と怒っているんですね

なんて自分勝手なんでしょう!

 

対処法

gistffaf4c7912be6b868231

というわけで、一度tempfileを経由することでバイナリとして読んでもらうことにします。これでRails側も「お、バイナリねじゃあそのまま受け取るよ」と受け取ってくれるようになります

 

Railsは確かに便利なんですけど、なんていうんだろう……気が利きすぎて持てない男って感じですね。あの人やさしいし面白いから友達としてはいいけど恋人にするのはちょっと……みたいなそんな感じ。

なんだかRailsとは友達になれそうな気がしてきました