アップロードしたファイルをDBに格納してみる

えー,バカのひとつ覚えで「アップロードしたファイルはディスクのどっかに置いとけ」っての信じてきたんだけど,運用が楽じゃない。Grailsとは言え,のちのちWARで配布とか考えると「カレントディレクトリってどこやん?」ってとこから考え込むハメになる。


ならばよろしい,DBに格納してしまえ。ってんで,やってみた。
これがまた至極簡単。まずは,こんなドメイン作るよ。


用もないのにいちいちBLOBデータをフェッチされてはたまらんので,FileInfoとFileContentをわけてみたよ。図にするとこんなん。Blogってのは,シャレだ。


ファイルのアップロード(BlogController)とダウンロード(FileInfoController)の処理はこんな感じ。ビュー側はほとんどDynamic Scaffoldでまかなえるけど,views/blog/create.gsp だけ一部修正するんで生成しといたほうがいい(どっちか言えば,generate-viewsで全部作って create.gsp 以外を消すってのが正しい)。


ポイントは,こんな感じ。

  • g:uploadformってタグがあったってこと。
  • one-to-oneの場合,addToXXX()に相当する処理がわからんかったんで,普通に代入した(個別に save() しとかないとダメっぽかった)。
  • MimeUtilityはJavaMailに含まれているのを使いたかった(準備の手間を惜しんだわけだ)。

とかくGORMでのBLOBの操作はおどろくほど簡単。効率とか消費リソースとかいったらキリないけど,こんな手間要らずでDBにファイルを格納できるんだったら,DBに格納してもいいかなって思うわな。:-)