当前位置: 首页 > 知识库问答 >
问题:

MongoDB使用Gridfs在用户集合中保存图像

萧琛
2023-03-14

目前,我正在使用Scala开发一个具有Play2框架的后端服务器。我有以下问题:

我使用文件处理程序GridFS在MongoDB中保存像图像这样的文档。GridFs创建两个文件:

fs.files(包含元数据)和fs.chunks(存储块)

但我想把图像保存在我自己的收藏中。所有图像都应该有一个数据库条目,如用户名和注释。我有两个解决问题的办法,但我需要帮助。

使用我自己的收藏:

{
   username: String
   comments: Array<String>
   image   : Gridfs 
}

如何使用GridFS在我自己的集合中获取图像?有可能吗?

我使用fs.files集合,它包含元数据并添加条目username和comments。我试过了,但不起作用。

谁能帮助我?

谢谢

共有1个答案

百里鸿祯
2023-03-14

至于解决方案#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)
  }
}

以端点为例,在前面的基础上进行扩展

  • /video/:id/file-您的GridFS文件终结点
  • /video/:id/meta-您的元信息端点(无论您需要它是什么)
  • /video/:id(可选)-组合文件和元响应。
 类似资料:
  • 问题内容: 我有一个将文件保存到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,但这似乎并没有给我提供下载的物理文件,而是用于读取内容的。如何下载文件? 问题答案: 希望这可以帮助!

  • 主要内容:将文件添加到 GridFSGridFS 是 MongoDB 的一种规范,用于存储和检索大型文件,如图像、音频、视频等。GridFS 也是一种存储文件的文件系统,但其数据是存储在 MongoDB 集合中的,GridFS 甚至可以存储超过 16MB 的文件。在存储文件时 GridFS 可以将一个文件分为多个数据块,并将每个数据块存储在一个单独的文档中,每个文档最大为 255KB。 默认情况下,GridFS 使用 fs.file

  • 问题内容: 我读过多个有关使用mgo保存文件的博客,但找不到满足特定需求的解决方案,请大声喊叫! 下面在MongoDb中插入对象: 下面能够保存文件: 现在,在插入对象之前,我需要将上述文件设置为: 我的结构对象: 用外行术语来说,问题是:如何使用mgo驱动程序通过GoLang结构在mongoDb中插入文件(从HTML表单接收)? 谢谢阅读!:) 更新: PDF存储在MongoDB中,如下所示: