Другой ответ хорошо описывает, как изменить размер изображения и сохранить ссылку на файл в файловой системе.
Если вы хотите использовать лифт-маппер для хранения фактического содержимого файла, вам необходимо создать объект пользовательской модели и определить для него двоичное поле. Попробуйте что-то вроде этого:
package code {
package model {
import _root_.net.liftweb.mapper._
import _root_.net.liftweb.util._
import _root_.net.liftweb.common._
// singleton object which manipulates storing of Document instances
object Document extends Document with KeyedMetaMapper[Long, Document] {
}
class Document extends KeyedMapper[Long, Document] {
def getSingleton = Document
def primaryKeyField = id
object id extends MappedLongIndex(this)
object name extends MappedString(this, 20) {
override def displayName = "Name"
override def writePermission_? = true
}
object content extends MappedBinary(this) {
override def displayName = "Content"
override def writePermission_? = true
}
}
}
}
Затем в классе начальной загрузки добавьте Document
в конце:
Schemifier.schemify(true, Schemifier.infoF _, User, Document)
Вуаля. Использование Document save (new Document)
сохраняет его в базе данных. Поля new Document
можно установить с помощью метода set
. Попробуйте поиграть с delete_!
, find
, findAll
методами синглтона Document
, чтобы удалить или найти его в базе данных. С этого момента все должно быть просто.
Наконец, для отображения изображения вы можете переопределить правила диспетчеризации Lift (в классе начальной загрузки, Boot.scala). Попробуйте поиграть с этим примером, который переопределяет правила для запросов pdf:
def getFile(filename: String): Option[Document] = {
val alldocs = Document.findAll()
alldocs.find(_.name.get == filename)
}
LiftRules.statelessDispatchTable.append {
case Req("file" :: name :: Nil, "pdf", GetRequest) =>
() =>
println("Got request for: " + name + ".pdf")
for {
stream <- tryo(
getFile(name + ".pdf") map {
doc => new java.io.ByteArrayInputStream(doc.content.get)
} getOrElse null
)
if null ne stream
} yield StreamingResponse(stream,
() => stream.close,
stream.available,
List("Content-Type" -> "application/pdf"),
Nil,
200)
}