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。
ソースコードはこちら