Чтение содержимого файла из MongoDB с помощью драйвера NoRM - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь прочитать файл изображения, хранящийся в MongoDB, для этого у меня есть следующий код в моих проектах ASP.net MVC 3

public FileContentResult ProfileImage(ObjectId id)
{

    using (var db = new MongoSession<User>())
    {
        var user = db.Queryable.Where(p => p.Id == id).FirstOrDefault();
        if (user != null && user.ProfilePicture != null)
        {   
            return File(user.ProfilePicture.Content.ToArray(), user.ProfilePicture.ContentType);
        }

        return null;
    }
}

При запросе к базе данных я вижу, что содержимое существует для файла ProfilePicture, но когда здесь, в проекте C #, длина содержимого составляет 0. Что-то не так в коде?

1 Ответ

1 голос
/ 15 декабря 2011

Похоже, вы встраивали GridFile в User, что-то вроде

class User 
{ 
    public GridFile ProfilePicture {get; set;}
}

Это не сработает;по крайней мере, не через поведение по умолчанию.GridFile s должны рассматриваться как первоклассные граждане, и они должны храниться и извлекаться с использованием объекта GridFileCollection:

var gridFS = conn.Database.Files();
var file = new GridFile();
// initialize file
gridFS.Save(file);
// query
var file2 = gridFS.FindOne(new { _id = file.Id });
// now, you can iterate file2.Content

Вы можете найти больше рабочих примеров кода в модульных тестах NoRM.

Причина в том, что, хотя GridFile в основном является классом, как и любой другой, схема хранения для файлов сетки очень отличается.Хотя «обычные» объекты сериализуются на месте, и один документ всегда соответствует одному объекту, это не так для GridFile.

Поскольку файлы могут быть намного больше максимального размера документа в MongoDB, они будут разбиты на chunks.Таким образом, когда вы сохраняете GridFile, драйвер должен будет хранить в файле сетки и количество фрагментов.По умолчанию размер чанков составляет 256 КБ, поэтому количество чанков будет зависеть от размера данных.Имена коллекций по умолчанию: fs.files и fs.chunks.

Вся эта логика находится в классе GridFileCollection, поэтому она не будет выполняться, если вы просто храните встроенный объект GridFileявного вызова расширения Files() для получения GridFileCollection.

...