【问题标题】:Serving files from GridFS with casbah/salat使用 casbah/salat 从 GridFS 提供文件
【发布时间】:2026-01-09 02:10:01
【问题描述】:

我想将作为用户内容上传的图像存储在 Scala Play 2 应用程序中的 GridFS 中。如何从GridFS.findOne 给我的GridFSDBFile 恢复二进制文件?

【问题讨论】:

    标签: mongodb scala gridfs casbah


    【解决方案1】:

    您可以通过流式传输其内容并设置正确的 http 标头来提供文件 - 这样做的一个示例是 here

    def getPhoto(file: ObjectId) = Action {
      import com.mongodb.casbah.Implicits._
    
      val gridFs = salat.gridFS("photos")
    
      gridFs.findOne(Map("_id" -> file)) match {
        case Some(f) => SimpleResult(
          ResponseHeader(OK, Map(
            CONTENT_LENGTH -> f.length.toString,
            CONTENT_TYPE -> f.contentType.getOrElse(BINARY),
            DATE -> new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", java.util.Locale.UK).format(f.uploadDate)
          )),
          Enumerator.fromStream(f.inputStream)
        )
    
        case None => NotFound
      }
    }
    

    但是,这通常不是提供文件的最佳性能选项。文件系统旨在做到这一点,或者将 url 根放在缓存后面 - 例如清漆或部署到 cdn 通常是更好的选择。

    【讨论】:

      最近更新 更多