Inna odpowiedź ładnie opisuje, jak zmienić rozmiar obrazu i zapisać odniesienie do pliku w systemie plików.
Aby użyć programu odwzorowującego unoszący do przechowywania rzeczywistej zawartości pliku, należy utworzyć niestandardowy obiekt modelu i zdefiniować na nim binarne pole. Spróbuj czegoś takiego:
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
}
}
}
}
Następnie w klasie bootstrap, dodaj Document
na koniec:
Schemifier.schemify(true, Schemifier.infoF _, User, Document)
Voila. Używanie Document save (new Document)
przechowuje go w bazie danych. Pola new Document
można ustawić za pomocą metody set
. Spróbuj grać metodami delete_!
, find
, , aby je usunąć lub znaleźć w bazie danych. To powinno być proste od tego momentu.
Na koniec, aby wyświetlić obraz, można zastąpić reguły dyspozycyjne windy (w klasie bootstrap, Boot.scala). Spróbuj zabawy z tym przykładzie, który zastępuje zasady żądań 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)
}
Bez urazy, ale brzmi to jak przyzwoity projekt do napisania! Ma wszystko: intrygę, przygodę i SQL. –
Tak, zamierzałem! Po prostu pomyślałem, że zanim zacznę, zasięgnę rady. – Joe