【问题标题】:error getting files from gridfs从 gridfs 获取文件时出错
【发布时间】:2016-03-17 20:46:04
【问题描述】:

我正在尝试显示来自 gridfs 的图像和文件。所以我从保存功能开始,它运行良好:

import javax.inject.Inject    
import org.joda.time.DateTime    
import scala.concurrent.Future    
import play.api.Logger
import play.api.Play.current
import play.api.i18n.{ I18nSupport, MessagesApi }
import play.api.mvc.{ Action, Controller, Request }
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.libs.json.{ Json, JsObject, JsString }    
import reactivemongo.api.gridfs.{ GridFS, ReadFile }    
import play.modules.reactivemongo.{
  MongoController, ReactiveMongoApi, ReactiveMongoComponents
}

import play.modules.reactivemongo.json._, ImplicitBSONHandlers._
import play.modules.reactivemongo.json.collection._
class griidfs @Inject() (
  val messagesApi: MessagesApi,
  val reactiveMongoApi: ReactiveMongoApi)
    extends Controller with MongoController with ReactiveMongoComponents {

  import java.util.UUID
  import MongoController.readFileReads

  type JSONReadFile = ReadFile[JSONSerializationPack.type, JsString]

  // get the collection 'articles'    
  // a GridFS store named 'attachments'
  //val gridFS = GridFS(db, "attachments")
  private val gridFS = reactiveMongoApi.gridFS

  // let's build an index on our gridfs chunks collection if none
  gridFS.ensureIndex().onComplete {
    case index =>
      Logger.info(s"Checked index, result is $index")
  }

  def saveAttachment =
    Action.async(gridFSBodyParser(gridFS)) { request =>
      // here is the future file!
      val futureFile = request.body.files.head.ref

      futureFile.onFailure {
        case err => err.printStackTrace()
      }

      // when the upload is complete, we add the article id to the file entry (in order to find the attachments of the article)
      val futureUpdate = for {
        file <- { println("_0"); futureFile }
        // here, the file is completely uploaded, so it is time to update the article
        updateResult <- {
          println("_1"); futureFile 

        }
      } yield updateResult

      futureUpdate.map { _ =>
        Redirect(routes.Application.index())
      }.recover {
        case e => InternalServerError(e.getMessage())
      }
    }

但是当我尝试从 gridfs 获取文件以使用以下代码在我的浏览器中显示它们时:

  import reactivemongo.api.gridfs.Implicits.DefaultReadFileReader        
  def getAttachment = Action.async { request =>

  // find the matching attachment, if any, and streams it to the client
  val file = gridFS.find[JsObject, JSONReadFile](Json.obj("_id" -> id))

    request.getQueryString("inline") match {
      case Some("true") =>
        serve[JsString, JSONReadFile](gridFS)(file, CONTENT_DISPOSITION_INLINE)

      case _            => serve[JsString, JSONReadFile](gridFS)(file)
    }
  }

我收到此错误:

type arguments [play.api.libs.json.JsObject,griidfs.this.JSONReadFile] 
do not conform to method find's type parameter bounds 
[S,T <: 
 reactivemongo.api.gridfs.ReadFile[reactivemongo.play.json.JSONSerializationPack.type, _]]

在这一行:

 val file = gridFS.find[JsObject, JSONReadFile](Json.obj("_id" -> id)) 

有什么帮助吗?

【问题讨论】:

    标签: mongodb playframework gridfs reactivemongo


    【解决方案1】:

    我一天中大部分时间都在与同一个问题作斗争,终于让它运行起来了。我认为这与导入有关,我将检查我的工作,然后开始一一删除它们以检查导致问题的原因。同时这里是我的进口清单。希望这会有所帮助

    import javax.inject.Inject
    import forms._
    import models._
    import org.joda.time.DateTime
    import play.modules.reactivemongo.json.JSONSerializationPack
    import services._
    import play.api.data._
    import play.api.data.Forms._
    import scala.async.Async._
    import play.api.i18n.{ I18nSupport, MessagesApi }
    import play.api.mvc.{ Action, Controller, Request }
    import play.api.libs.json.{ Json, JsObject, JsString }
    import reactivemongo.api.gridfs.{ GridFS, ReadFile }
    import play.modules.reactivemongo.{
       MongoController, ReactiveMongoApi, ReactiveMongoComponents
    }
    import play.api.libs.concurrent.Execution.Implicits.defaultContext
    import scala.concurrent.Future
    import play.modules.reactivemongo.json._
    import com.mohiva.play.silhouette.api.{ Environment, LogoutEvent, Silhouette }
    import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
    import com.mohiva.play.silhouette.impl.providers.SocialProviderRegistry
    import MongoController._
    

    编辑答案:

    我已经把它缩小到这个:“import MongoController._”

    添加它,你应该没问题:)

    【讨论】:

    • 感谢您的帮助,但我仍然有同样的错误!你用的是哪个版本的reactivemongo? ——
    • 导入的另一件事它给出了这个错误:未找到:对象 MongoController,我尝试使用这个 import play.modules.reactivemongo.MongoController._ 但它不起作用
    • 我的响应式 mongo 版本是 "org.reactivemongo" %% "play2-reactivemongo" % "0.11.7.play24",
    • 我的是 "org.reactivemongo" %% "play2-reactivemongo" % "0.11.9"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多