Liftことはじめ その2 ファイルアップロード

前述の記事のための覚書。

ファイルアップロード
model/Track.scala

package code.model

import net.liftweb.mapper._
import net.liftweb.util._
import net.liftweb.common._

object Track extends Track with LongKeyedMetaMapper[Track] {
  override def dbTableName = "tracks"
}

class Track extends LongKeyedMapper[Track] with IdPK {
  def this(albumid: Long, seq: Long, tracktitle: String, filename: String, mimetype: String, lob:Array[Byte]) = {
    this()
    this.albumid(albumid)
    this.seq(seq)
    this.tracktitle(tracktitle)
    this.filename(filename)
    this.mimetype(mimetype)
    this.trackatach(lob)
  }
…
  object trackatach extends MappedBinary(this)

Trackオブジェクトのtrackatachに格納。

snippet/TrackView.scala

package code.snippet

import java.io._
import scala.xml.{NodeSeq, Text}
import net.liftweb.util._
import net.liftweb.common._
import Helpers._

import code.model.Track
import net.liftweb.mapper._
import net.liftweb.http._
import S._
import SHtml._
import net.liftweb.http.js.{JsCmd, JsCmds}

class TrackView {
…
  var upload: Box[FileParamHolder] = Empty
…
  def render = {
    "name=albumid" #> SHtml.hidden( () => albumid) &
    "name=seq" #> SHtml.text( seq, seq = _) &
    "name=tracktitle" #> SHtml.text( tracktitle, tracktitle = _) &
    "name=upload" #> SHtml.fileUpload(s => upload = Full(s)) &
    "type=submit" #> SHtml.onSubmitUnit(process);
  }
…
  def getFileParamHolder(upload: Box[FileParamHolder]): FileParamHolder = upload match {
    case Full(FileParamHolder(name, mime, fileName, data)) => FileParamHolder(name, mime, fileName, data)
  }
…
  def addProcess() {
    try {
      val track: Track = isAtachFileExist(upload) match {
        case true => new Track(albumid.toLong, seq.toLong, tracktitle, getFileParamHolder(upload).fileName, getFileParamHolder(upload).mimeType, getFileParamHolder(upload).file)
        case false => new Track(albumid.toLong, seq.toLong, tracktitle)
      }
      track.validate match{
        case Nil => {
          track.save()
          S.notice("Added " + track.tracktitle)
          S.redirectTo("/track?albumid=" + albumid)
        }
        case x => {
          S.error("Validation Error!")
          S.redirectTo("/track?albumid=" + albumid)
        }
      }
    } catch {
      case e: java.lang.NumberFormatException => {
        S.error("SEQ must be the number!")
        S.redirectTo("/track?albumid=" + albumid)
      }
    }
  }

ブラウザからファイルをアップロードさせるため、SHtml.fileUploadを使用。
戻り値が、FileParamHolderをとる。
オブジェクト、mime type,ファイル名の取り出しは、それぞれ属性、file,mimetype,filename。
model/trackにセットしてsave。
ソースコードこちら