首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从gridfs获取文件时出错

从gridfs获取文件时出错
EN

Stack Overflow用户
提问于 2016-03-18 04:46:04
回答 1查看 367关注 0票数 0

我正在尝试显示来自gridfs的图像和文件。所以我从save函数开始,它工作得很好:

代码语言:javascript
运行
复制
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获取文件以在浏览器中显示它们时,使用以下代码:

代码语言:javascript
运行
复制
  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)
    }
  }

我得到了这个错误:

代码语言:javascript
运行
复制
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, _]]

在这一行中:

代码语言:javascript
运行
复制
 val file = gridFS.find[JsObject, JSONReadFile](Json.obj("_id" -> id)) 

有什么需要帮忙的吗?

EN

回答 1

Stack Overflow用户

发布于 2016-03-18 23:35:31

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

代码语言:javascript
运行
复制
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._

编辑答案:

我已经将其范围缩小到这个范围:“导入MongoController._”

添加它,您应该就可以了:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36071358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档