La otra respuesta describe muy bien cómo cambiar el tamaño de la imagen y almacenar una referencia al archivo en el sistema de archivos.
Si desea utilizar el levantador de mapas para almacenar el contenido real del archivo, debe crear su objeto de modelo personalizado y definir un campo binario en él. Intentar algo como esto:
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
}
}
}
}
Luego, en la rutina de carga, anadir este Document
al final:
Schemifier.schemify(true, Schemifier.infoF _, User, Document)
Voila. Usando Document save (new Document)
lo almacena en la base de datos. Los campos new Document
se pueden configurar mediante el método set
. Intente jugar con delete_!
, find
, findAll
métodos del singleton Document
para eliminarlo o encontrarlo en la base de datos. Debería ser sencillo a partir de ahora.
Finalmente, para mostrar la imagen, puede anular las reglas de despacho de Lift (en la clase bootstrap, Boot.scala). Trate de jugar un poco con este ejemplo que anula las reglas para las peticiones de 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)
}
Sin ofender, pero esto suena como un proyecto decente para escribir usted mismo! Tiene de todo: intriga, aventura y SQL. –
Sí, iba a hacerlo! Solo pensé en buscar consejo antes de comenzar. – Joe