2015-01-19 2 views
0

на данный момент я занимаюсь разработкой серверного сервера с Play 2 Framework с использованием Scala. У меня проблема:MongoDB сохраняет изображения в пользовательской коллекции с помощью Gridfs

Я сохраняю документы, подобные изображениям в MongoDB, используя GridFS-обработчик файлов. GridFs создает два файла:

fs.files, который содержит метаданные и fs.chunks, в котором хранятся куски

Но я хотел бы сохранить изображения в моей коллекции. Все изображения должны иметь запись в базе данных, такую ​​как имя пользователя и комментарии. У меня есть две идеи, как решить проблему, но мне нужна помощь.

Решение # 1:

Используйте свою собственную коллекцию:

{ 
    username: String 
    comments: Array<String> 
    image : Gridfs 
} 

Как получить изображение в моей коллекции с помощью GridFS? Является ли это возможным?

Решение # 2:

Я использую коллекцию fs.files, которые содержат метаданные и добавить имя пользователя и комментарии записей. Я попробовал, но это не сработает.

Кто может мне помочь?

Благодаря

+0

Насколько велики будут ваши изображения? GridFS - полезный подход для хранения очень больших файлов, но не существенный, если ваши изображения меньше [максимального размера документа] (http://docs.mongodb.org/manual/reference/limits/#BSON-Document-Size) (16 МБ, как в MongoDB 2.6). Вы можете рассмотреть возможность хранения изображений непосредственно в документе в виде двоичных данных (что ближе к тому, что вам нужно, с предлагаемыми решениями). – Stennie

+0

Пока не могу сказать. Потому что я хотел бы хранить аудио и видеофайлы. Вот почему я хотел бы использовать gridfs. Видеофайлы получат больше 16 МБ – masterWN

ответ

0

Что касается решения # 1

Если вы используете ReactiveMongo, есть пример проекта, с композитным ответа сервера, состоящий из файлов и JSON

https://github.com/sgodbillon/reactivemongo-demo-app/blob/master/app/controllers/Application.scala

def showEditForm(id: String) = Action.async { 
    val objectId = new BSONObjectID(id) 
    // get the documents having this id (there will be 0 or 1 result) 
    val futureArticle = collection.find(BSONDocument("_id" -> objectId)).one[Article] 
    // ... so we get optionally the matching article, if any 
    // let's use for-comprehensions to compose futures (see http://doc.akka.io/docs/akka/2.0.3/scala/futures.html#For_Comprehensions for more information) 
    for { 
     // get a future option of article 
     maybeArticle <- futureArticle 
     // if there is some article, return a future of result with the article and its attachments 
     result <- maybeArticle.map { article => 
     import reactivemongo.api.gridfs.Implicits.DefaultReadFileReader 
     // search for the matching attachments 
     // find(...).toList returns a future list of documents (here, a future list of ReadFileEntry) 
     gridFS.find(BSONDocument("article" -> article.id.get)).collect[List]().map { files => 
      val filesWithId = files.map { file => 
      file.id.asInstanceOf[BSONObjectID].stringify -> file 
      } 
      Ok(views.html.editArticle(Some(id), Article.form.fill(article), Some(filesWithId))) 
     } 
     }.getOrElse(Future(NotFound)) 
    } yield result 
    } 

Вы можете использовать его в качестве эталонной реализации.

Что касается решения # 2

Вы должны быть в состоянии хранить дополнительные данные в DefaultFileToSave.metadata, и запрос после Монго с { "metadata.user": "пользователь"} (Посмотрите на Query on MongoDB GridFS metadata (Java))

Другое решение

Храните файлы & вашей метаинформации в качестве независимых объектов и управляйте ими независимо, в будущем их будет проще расширить.

Для GridFS загрузки функциональность (https://github.com/ReactiveMongo/Play-ReactiveMongo)

def upload = Action(gridFSBodyParser(gridFS)) { request => 
    // here is the future file! 
    val futureFile: Future[ReadFile[BSONValue]] = request.body.files.head.ref 
    futureFile.map { file => 
    // do something 
    Ok 
    }.recover { 
    case e: Throwable => InternalServerError(e.getMessage) 
    } 
} 

Чтобы расширить предыдущий, с точки зрения конечных точек, в качестве примера

  • /видео /: идентификатор/файл - ваш GridFS файл конечной точки
  • /video /: id/meta - конечная точка вашей метаинформации (что вам нужно для этого)
  • /video /: id (необязательно) - комбинированный файл & meta response.
+1

Спасибо за ваш ответ. Я использую Play-ReactiveMongo с casbah. Я не могу найти позицию, в которой сохраняется изображение? Насколько мне известно, в MongoDB соединения не поддерживаются. Как я могу хранить файлы и метаинформацию как независимые объекты? Можете ли вы привести несколько примеров? – masterWN