目前我正在使用Scala开发一个带有Play 2 Framework的后端服务器。 我有以下问题:
我使用File Handler GridFS在MongoDB中保存图像等文档。 GridFs创建了两个文件:
fs.files,包含元数据和 fs.chunks,存储块
但我想将图像保存在我自己的收藏中。所有图像都应该有一个数据库条目,如用户名和注释。 我有两个想法如何解决问题,但我需要帮助。
使用我自己的收藏品:
{
username: String
comments: Array<String>
image : Gridfs
}
如何使用GridFS在我自己的集合中获取图像?有可能吗?
我使用fs.files集合,其中包含元数据并添加条目用户名和注释。我试过了,但它不起作用。
谁可以帮助我?
由于
答案 0 :(得分:0)
至于解决方案#1
如果您使用的是ReactiveMongo,则会有一个示例项目,其中包含复合服务器响应,包含文件和json
https://github.com/sgodbillon/reactivemongo-demo-app/blob/master/app/controllers/Application.scala
def showEditForm(id: String) = Action.async {
val objectId = new BSONObjectID(id)
// get the documents having this id (there will be 0 or 1 result)
val futureArticle = collection.find(BSONDocument("_id" -> objectId)).one[Article]
// ... so we get optionally the matching article, if any
// let's use for-comprehensions to compose futures (see http://doc.akka.io/docs/akka/2.0.3/scala/futures.html#For_Comprehensions for more information)
for {
// get a future option of article
maybeArticle <- futureArticle
// if there is some article, return a future of result with the article and its attachments
result <- maybeArticle.map { article =>
import reactivemongo.api.gridfs.Implicits.DefaultReadFileReader
// search for the matching attachments
// find(...).toList returns a future list of documents (here, a future list of ReadFileEntry)
gridFS.find(BSONDocument("article" -> article.id.get)).collect[List]().map { files =>
val filesWithId = files.map { file =>
file.id.asInstanceOf[BSONObjectID].stringify -> file
}
Ok(views.html.editArticle(Some(id), Article.form.fill(article), Some(filesWithId)))
}
}.getOrElse(Future(NotFound))
} yield result
}
您可以将其用作参考实现。
至于解决方案#2
您应该能够在DefaultFileToSave.metadata中存储其他数据,然后使用{&#34; metadata.user&#34;来查询mongo。 :&#34;用户&#34;}(查看Query on MongoDB GridFS metadata (Java))
另一种解决方案
保留档案&amp;您的元信息作为独立实体,并独立管理它们,将来扩展它们会更容易。
对于GridFS上传功能(https://github.com/ReactiveMongo/Play-ReactiveMongo)
def upload = Action(gridFSBodyParser(gridFS)) { request =>
// here is the future file!
val futureFile: Future[ReadFile[BSONValue]] = request.body.files.head.ref
futureFile.map { file =>
// do something
Ok
}.recover {
case e: Throwable => InternalServerError(e.getMessage)
}
}
要扩展以前的,就端点而言,作为示例