grails で uploader を作る。

久々の更新。
大学のとある講義で Grails を使った Webアプリケーションを作ることになりまして、 その作業のログと得た知識の整理を兼ねてブログを更新してみたり。

今回は、Grails で簡易アップローダの実装まで。

view の作成

まず、ファイルをアップロードするための form を作成する。

% grails create-controller uploader

これは、controller を生成するコマンドだけど、あとで必要なので今のうち生成。

上のコマンドを実行したら「views」ってフォルダの中に「uploader」というフォルダが作成されている。 この中にコントローラ uploader に対応するビューを置いていく。

form を作成するため「uploader」フォルダの中に index.gsp というファイルを作成。
index.gsp には、以下のような記述をする(ヘッダーとかは省略… )

1
2
3
4
<g:form action="upload" method="post" enctype="multipart/form-data">
  Upload Form:  <input type="file" name="myFile" />
  <input type="submit" />
</g:form>

gspタグというのを使っているが、html のフォームとほとんど変わらないみたい。

ここで重要なのが、<g:form>タグの action属性に upload と記述しているところ。 form を送信したときのアクションを指定していて、controller にこの uploadアクションを記述する。

controller の作成

view には、どういった表示をするのか、どういうインターフェースにするのかを書いた。

次に、どんな操作をしたら、どう処理するかというのを controller に書いていく。 controller の雛形は、「controllers」フォルダに生成されているので、そのファイルを編集していく。

初期の状態はこんな感じ。

1
2
3
4
5
package gapp
class UploaderController {
    def index = {
    }
}

このファイルに、form を送信したときの処理 uploadアクションを追加していく。
具体的には次のような記述を追加する。

1
2
3
4
5
6
7
8
9
10
11
12
class UploaderController {
    ....
    def upload = {
        def f = request.getFile('myFile')
        if (!f.empty) {
            f.transferTo(new File('data/filename.jpg'))
        }
        else {
            flash.message = 'file cannot be empty'
            redirect(action: index)
        }
}

request.getFile('myFile') メソッドでアップロードされたファイルの情報を取得。
f.transferTo(new File('data/filename.jpg')) で、MultiPartFormData をファイルそのものに変換。

これで、controller の作成は終了。

実行!

% grails run-app

コマンドを実行して何事も無く起動できたら http://localhost:8080/gapp/uploader/index にアクセス。 ファイルを選択して送信…すると真っ白いページに飛ぶが、「data」フォルダの中を見ると filename.jpg というファイルがアップロードされていることが確認できる。 これで、簡単ではあるがアップローダを作成することができた。

現状では、ファイル名を決め打ちしているのでアップロードするたびにファイルが上書きされてしまう。 なので、ファイル名を元のファイルと同じにするか、ファイル名を form 入力かなにかで指定できるようにする必要がある。 これについては、後日まとめたいと思う。

参考

Comments