Câu trả lời khác mô tả cách thay đổi kích thước hình ảnh và lưu trữ tham chiếu đến tệp trên hệ thống tệp.
Nếu bạn muốn sử dụng trình vẽ bản đồ để lưu trữ nội dung tệp thực, bạn phải tạo đối tượng mô hình tùy chỉnh và xác định trường nhị phân trên đó. Hãy thử một cái gì đó như thế này:
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
}
}
}
}
Sau đó, trong lớp bootstrap, thêm Document
này ở cuối:
Schemifier.schemify(true, Schemifier.infoF _, User, Document)
Voila. Sử dụng Document save (new Document)
lưu nó vào cơ sở dữ liệu. Bạn có thể đặt các trường của new Document
bằng cách sử dụng phương thức set
. Thử chơi với các phương thức delete_!
, find
, findAll
của Document
singleton để xóa hoặc tìm nó trong cơ sở dữ liệu. Nó nên được đơn giản từ thời điểm này trên.
Cuối cùng, để hiển thị hình ảnh, bạn có thể ghi đè lên các quy tắc điều phối của Lift (trong lớp bootstrap, Boot.scala). Hãy thử phát xung quanh với ví dụ này ghi đè các quy tắc cho yêu cầu 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)
}
Không có hành vi phạm tội, nhưng điều này nghe có vẻ giống như một dự án tốt để tự viết! Nó có mọi thứ: âm mưu, phiêu lưu và SQL. –
Vâng, tôi sẽ đến! Tôi chỉ nghĩ rằng tôi sẽ tìm kiếm lời khuyên trước khi bắt đầu. – Joe