grails で uploader を作る。 その3

前回からの続き。
今回は、アップロードしたファイルの情報を DB に格納するところまで実装する。

DB の環境設定

はじめに、使う DB を MySQL に変更する。

DB を変更するために、conf/DataSource.groovy を編集する。
その前に、grails で使うための DB をあらかじめ作っておくのと、 Grails と MySQL を連携するためのドライバ MySQL JDBC をダウンロードし、「lib」フォルダ以下に置いておく必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    username = "ユーザネーム"
    password = "パスワード"
}
...
environments {
    development {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost/データベース名"
        }
        ...
    }
    ...
}

これで、Grails から MySQL を使うことができる。

domain の作成

まず、ドメインクラスを作成する。

% grails create-domain-class uploader

これで、domain/{アプリ名}/Uploader.groovy というファイルが生成されているので、 このファイルにテーブルのフィールド情報等を記述していく。

今回はアップロードしたファイルの情報を DB に格納するので、

  • String title
  • String summary
  • String filename
  • Date dateCreated
  • Date lastUpdated

を定義する。

また、今回のようにアップロードされたファイルの名前を DB に格納する場合、次のような制約を記述する必要があるらしい。 (参照:ファイルのアップロードと Atom の配信

filename(blank:true, nullable:true)

これらをまとめると、ドメインクラス Uploader.groovy は以下のような感じになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Uploader {
    static constraints = {
        title()
        summary(maxSize:1000)
        filename(blank:true, nullable:true)
        dateCreated()
        lastUpdated()
    }
    static mapping = {
        sort "lastUpdated":"desc"
    }
    String title
    String summary
    String filename
    Date dateCreated
    Date lastUpdated
}

static constraints ={} には、フィールドの順番/長さ/パターンなど、フィールドに関する制約を記述。 static mapping = {} には、主キー/複合キー等の設定や、今回のようにソート条件などを記述。
以上で、DB の設定と準備は終了。

controller の編集

前回作った controller を編集していく。

upload アクションに、form 入力された値(これは全て params にまとめられてる)を持つインスタンスを作成。 インスタンスを作成したら、

  • hasErrors() メソッド:インスタンスがきちんと作られているかチェック。
  • save() メソッド:DB に保存

といったメソッドを使ってエラー処理、DB書込みを行う。

また、params の filename は「myFile」となっているので、これをアップロードされたファイルのオリジナルネームに変更している。 これらをまとめると、以下のような感じになる。

1
2
3
4
5
6
7
8
9
10
11
12
class UploaderController {
    ....
    def upload = {
        def upParam = new Uploader(params)
        ...
        if (!file.empty) {
            ...
            f.transferTo(new File('data/'+file.originalFilename))
            upParam.filename = file.originalFilename
        }
        if (!upParam.hasErrors() && upParam.save()) {
        }

以上で、アップロードされたファイルの情報が指定した DB に書き込まれる。

今回はファイルの情報を DB に格納するための処理を追加しただけなので、ファイル送信後のページは相変わらず真っ白なページ…。 DB に格納後ファイル一覧のページに redirect するように記述するとエラーでるんですよね。なんでだろ?

ファイルアップロード → DB書込み → ファイルの表示 ができるとアップローダらしくなるんだけどな。 この辺りはもう少し時間がかかりそう。

Comments