Toto je jednoduchá úloha s možno naivným prístupom. Získajte všetky súbory, ktoré zodpovedajú kritériám. So súbormi myslím metadáta súborov - nie binárne.
for {
files <- gfs.find(BSONDocument("metadata.ideaId" -> BSONObjectID(ideaId))).collect[Seq]()
} yield {
Ok(Json.toJson(files))
}
Mám rozsah pôsobnosti reaktivemongo.api.gridfs.Implicits._, ale chápem
No Json deserializer found for type Seq[reactivemongo.api.gridfs.ReadFile[reactivemongo.bson.BSONValue]]
odpovede:
4 pre odpoveď č. 1Na túto úlohu používam veľmi jednoduchý ručne vyrobený serializátor:
import play.api.libs.json._
import play.api.libs.json.Json._
import reactivemongo.api.gridfs.ReadFile
import reactivemongo.bson.{BSONValue, BSONObjectID}
implicit val fileWrites = new Writes[ReadFile[BSONValue]] {
def writes(file: ReadFile[BSONValue]): JsValue = {
val id = file.id.asInstanceOf[BSONObjectID].stringify
obj(
"_id" -> id, // need it with underscore
"name" -> file.filename,
"url" -> routes.Files.serveFile(id).url, // app specific
"thumbnailUrl" -> routes.Files.serveFile(id).url, // app specific
"extension" -> file.filename.split(".").last,
"contentType" -> file.contentType,
"size" -> file.length,
"uploadDate" -> file.uploadDate,
"deleteUrl" -> "", // app specific
"deleteType" -> "DELETE"
)
}
}
takže to môžete použiť takto:
import helpers.Formats.fileWrites // your package here
def all = Action.async { request =
gfs.find(query).collect[List]() map {
case files: List[ReadFile[BSONValue]] => Ok(prettyPrint(obj("files" -> toJson(files))))
}
1 pre odpoveď č. 2
Pokúšate sa serializovať „súbory“, ktoré súSeq [reactivemongo.api.gridfs.ReadFile [reactivemongo.bson.BSONValue]] pre JSON, čo nie je možné z krabice. Musíte preň poskytnúť implicitný serializátor JSON (ako inštanciu play.api.libs.json.Writes [Seq [ReadFile [BSONValue]]]).
vidieť http://www.playframework.com/documentation/2.1.3/ScalaJson
Je tu časť „Prevod hodnoty Scala na JsValue“, ktorá popisuje podrobnosti.