L'altra risposta descrive in modo dettagliato come ridimensionare l'immagine e memorizzare un riferimento al file sul file system.
Se si desidera utilizzare il programma di sollevamento per memorizzare il contenuto del file corrente, è necessario creare l'oggetto del modello personalizzato e definire un campo binario su di esso. Provare qualcosa di simile:
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
}
}
}
}
Poi, in classe di bootstrap, aggiungere questo Document
alla fine:
Schemifier.schemify(true, Schemifier.infoF _, User, Document)
Voila. L'utilizzo di Document save (new Document)
lo memorizza nel database. I campi di new Document
possono essere impostati utilizzando il metodo set
. Prova a giocare con delete_!
, find
, findAll
metodi del file singleton da Document
da eliminare o trovarlo nel database. Dovrebbe essere semplice da questo punto in poi.
Infine, per visualizzare l'immagine, è possibile sovrascrivere le regole di dispacciamento di Lift (nella classe bootstrap, Boot.scala). Prova a giocare con questo esempio che sovrascrive le regole per le richieste 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)
}
Senza offesa, ma questo suona come un progetto decente per scrivere te stesso! Ha tutto: intrighi, avventure e SQL. –
Sì, stavo per! Ho solo pensato di chiedere un consiglio prima di iniziare. – Joe