目前,我正在使用Scala开发一个具有Play2框架的后端服务器。我有以下问题:
我使用文件处理程序GridFS在MongoDB中保存像图像这样的文档。GridFs创建两个文件:
fs.files(包含元数据)和fs.chunks(存储块)
但我想把图像保存在我自己的收藏中。所有图像都应该有一个数据库条目,如用户名和注释。我有两个解决问题的办法,但我需要帮助。
使用我自己的收藏:
{
username: String
comments: Array<String>
image : Gridfs
}
如何使用GridFS在我自己的集合中获取图像?有可能吗?
我使用fs.files集合,它包含元数据并添加条目username和comments。我试过了,但不起作用。
谁能帮助我?
谢谢
至于解决方案#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中存储额外的数据,然后使用{“metadata.User”:“User”}查询mongo(查看MongoDB GridFS元数据查询(Java))
另一种解决方案
将文件和元信息作为独立的实体来保存,并独立地管理它们,这样将来扩展它们会更容易。
对于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)
}
}
以端点为例,在前面的基础上进行扩展
问题内容: 我有一个将文件保存到gridfs的功能。重构后,它以某种方式停止工作,我花了两个多小时呆呆地盯着它。我发誓它与以前大致相同。我似乎记得起初在添加内容之前它不起作用,然后开始起作用,但这可能是失眠。从本质上讲,问题在于db.fs.files集合没有任何记录,但是将块添加到db.fs.chunks中。 数据 是通过fs.readFile()从磁盘加载的缓冲区 问题答案: 有两种解决方案。您
问题内容: noob Golang和Sinatra人在这里。我入侵了Sinatra应用程序,以接受从HTML表单发布的上传文件,并通过GridFS将其保存到托管的MongoDB数据库中。这似乎工作正常。我正在使用mgo驱动程序在Golang中编写相同的应用程序。 从功能上来说,它工作正常。但是在Golang代码中,我将文件读入内存,然后使用mgo将文件从内存写入MongoDB。这似乎比我同等的Si
我正在使用MongoDB 3.2和Java 1.8版本和Mongo-Java驱动程序。我已将图像保存在数据库中。我能够保存图像,读取图像和读取所有图像。现在我想在GridFS中更新图像。如果图像的名称相同,我想覆盖图像。当我试图用相同的名字保存图像时,我得到了两个图像。我正在使用下面的代码来保存图像。 谁能指导我到任何特定的文档链接/工作周围,以便我可以覆盖/更新图像。
问题内容: 我需要从GridFS下载简历,以下是为此目的编写的代码ive,但这似乎并没有给我提供下载的物理文件,而是用于读取内容的。如何下载文件? 问题答案: 希望这可以帮助!
问题内容: 我读过多个有关使用mgo保存文件的博客,但找不到满足特定需求的解决方案,请大声喊叫! 下面在MongoDb中插入对象: 下面能够保存文件: 现在,在插入对象之前,我需要将上述文件设置为: 我的结构对象: 用外行术语来说,问题是:如何使用mgo驱动程序通过GoLang结构在mongoDb中插入文件(从HTML表单接收)? 谢谢阅读!:) 更新: PDF存储在MongoDB中,如下所示:
主要内容:将文件添加到 GridFSGridFS 是 MongoDB 的一种规范,用于存储和检索大型文件,如图像、音频、视频等。GridFS 也是一种存储文件的文件系统,但其数据是存储在 MongoDB 集合中的,GridFS 甚至可以存储超过 16MB 的文件。在存储文件时 GridFS 可以将一个文件分为多个数据块,并将每个数据块存储在一个单独的文档中,每个文档最大为 255KB。 默认情况下,GridFS 使用 fs.file