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

GridFileに埋め込んでUserいるかのように見えます。

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は基本的に他のクラスと同じですが、グリッド ファイルの格納方式が大きく異なるためです。「通常の」オブジェクトはその場でシリアル化され、1 つのドキュメントは常に 1 つのオブジェクトに対応しますが、これはGridFile.

ファイルは MongoDB の最大ドキュメント サイズよりもはるかに大きくなる可能性があるため、chunks. したがって、 を格納するGridFile場合、ドライバはグリッド ファイルいくつかのチャンクを格納する必要があります。デフォルトでは、チャンクのサイズは 256kB であるため、チャンクの数はデータ サイズによって異なります。デフォルトのコレクション名はfs.filesfs.chunksです。

このロジックはすべてGridFileCollectionクラスに存在するため、拡張機能を明示的にGridFile呼び出して.Files()GridFileCollection

于 2011-12-15T08:21:46.777 に答える