从gridfs获取文件时出错

时间:2016-03-17 20:46:04

标签: mongodb playframework gridfs reactivemongo

我正在尝试从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)) 

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

我一直在大部分时间都在和同样的问题作斗争,最后还是继续运行。我认为它与我将在我的工作中检查的导入有关,然后开始逐个删除它们以检查哪一个导致问题。与此同时,这里是我的进口清单。希望这有帮助

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 ._”

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