uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Grailsのファイルアップロードは一行も書かなくていい

(追記) grails3ではscaffoldの仕様が変り、以下の内容に加えて、create.gspのg:upload..を
g:uploadform..に修正する必要があります。


Grailsで、ちょっとファイルアップロードの処理でもするか、と思って調べたら、ドメインクラスにbyte[]メンバを書くだけで、scaffoldされるViewでは対応するフィールドに対してファイルアップロード用のFORMが生成されてて、アップロードするとファイル内容がフィールド内容に格納されて、これはORマッピングされているものだからそのまんまDBに格納されてしまうのですね。ポルナレフ風に言うと、

何を言ってるかわからないと思うが、ありのままを書くぜ。
「byte[]フィールドを書いたと思ったらファイルがアップロードされててDBに格納されていた」
超高生産性とかそんなちゃちなもんじゃねえ、もっと恐ろしいものの片鱗を見たぜ!

という感じ。格納されるのはBLOB型になるのかな。要は

class SomeData {
   byte[] myFile
}

でOK。ファイルアップロードに関しては、結局1行もコードや設定を書いてないw。Springで苦労してた人が見たら暴動が起きるぞきっと。

なお、アップロード時にDBに格納するのではなくてファイルの中身を処理したいとか言う場合にはrequest.getFile("myFile").inputStream.eachLine(){...}ぐらいな処理を書く必要があるです。別ファイルに保存したければ、request.getFile("myFile").transferTo(new File("/tmp/data"));とか。getFileで返るのはSpring FrameworkのMultipart Fileオブジェクトととのことでその実体はJakarta CommonsのFileUploadみたい。scaffold使わない場合はGSPタグで以下のようなファイルアップロードのタグも書く必要もあります。

<g:form action="コントローラのアクション名" method="post" enctype="multipart/form-data">
 <input type="file" id="myFilex" name="myFilex" />
</g:form>

ジョジョの奇妙な冒険 (21) (ジャンプ・コミックス)

ジョジョの奇妙な冒険 (21) (ジャンプ・コミックス)