2016-03-17 4 views
0

Я пытаюсь отображать изображения и файлы из gridfs. Поэтому я начал с функцией сохранения и она хорошо работает:ошибка получения файлов из 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)) 

Любая помощь, пожалуйста?

ответ

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

Редактировать Ответ:

Я свели к этому: «импорт» MongoController._

добавить его, и вы должны быть хорошо :)

+0

Спасибо для вашей помощи, но у меня все еще такая же ошибка! какую версию реагировать вы используете? - – Rajeun

+0

Еще одна вещь для импорта: эта ошибка: не найден: объект MongoController и я попытался с этим импортом play.modules.reactivemongo.MongoController._ и он не работает – Rajeun

+0

Моя версия реактивного монго - «org.reactivemongo "%%" play2-reactivemongo "%" 0.11.7.play24 ", –

Смежные вопросы