ドラッグ&ドロップでアップロード
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?)使う方が賢い気がするのでいいか。