1

我正在尝试读取存储在 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. 代码有什么问题吗?

4

1 回答 1

1

看起来好像您正在嵌入GridFileUser例如

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

那是行不通的;至少,不是通过默认行为。GridFiles 必须被视为一等公民,并且必须使用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. 因此,当您存储 a 时GridFile,驱动程序将不得不存储网格文件一些块。默认情况下,块大小为 256kB,因此块的数量将取决于数据大小。默认集合名称是fs.filesfs.chunks

所有这些逻辑都驻留在GridFileCollection类中,因此如果您只是存储嵌入式GridFile对象而不是Files()显式调用扩展来检索GridFileCollection.

于 2011-12-15T08:21:46.777 回答