ドラッグ&ドロップでアップロード

Rails3.2でドラッグ&ドロップするとファイルをアップロードできるようにしてみた。

大体のところは http://kray.jp/blog/rails3-fileupload/ を参考にさせて頂きました。以下、いくつかハマった所だけ。

Webrickやmongrelなら問題ないが、unicornで走らせようとするとrequest.body.lengthがNoMethodErrorを返すので、request.body.sizeに変更する。 さらにtemp_fileの保存時にEncoding::UndefinedConversionErrorが発生するのでforce_encoding(‘utf-8’)を付ける。 以上を修正した_store_uploadメソッドはこんな感じ。

あと、元記事ではわざと単純にしてあるのだと思うけど、アップロード完了時のコールバックをlocation.reload();にすると複数ファイルをアップロードした時に中断してしまうので、ajaxで何かしら書く。こんな感じにした。

complete_actionにajaxで書き換えるアクションを指定しておいてevalするだけ。

Paperclip初めて使ったけど便利。DBへのblob保存に対応してないけど、確かにS3(+Cloudfront?)使う方が賢い気がするのでいいか。