67 votes

MongoDB GridFs avec C #, comment stocker des fichiers tels que des images?

Je suis le développement d'une application web avec mongodb comme mon back-end. J'aimerais avoir les utilisateurs à télécharger des photos de leurs profils comme lié en photo de profil. Je suis à l'aide d'une page aspx avec MVC2 et j'ai lu que GridFs bibliothèque est utilisée pour stocker des gros fichiers comme les fichiers binaires. Je l'ai cherché partout pour trouver des indices que la façon dont cela est fait, mais mongodb n'ont pas de documentation pour C# api ou GridFs C#. Je suis perplexe et confus, vraiment pu utiliser un autre ensemble de cerveaux.

Quelqu'un sait comment mettre en œuvre un upload de fichier contrôleur qui stocke une image téléchargée par l'utilisateur dans une collection mongodb? Un million de mercis!

J'ai essayé des variantes de ce vain.

Database db = mongo.getDB("Blog");
GridFile file = new GridFile(db);
file.Create("image.jpg");

var images = db.GetCollection("images");
images.Insert(file.ToDocument());

93voto

Andrew Orsich Points 24503

Les exemples suivants montrent comment enregistrer un fichier et le relire à partir de gridfs (en utilisant le pilote officiel mongodb):

  var server = MongoServer.Create("mongodb://localhost:27020");
 var database = server.GetDatabase("tesdb");

 var fileName = "D:\\Untitled.png";
 var newFileName = "D:\\new_Untitled.png";
 using (var fs = new FileStream(fileName, FileMode.Open))
 {
    var gridFsInfo = database.GridFS.Upload(fs, fileName);
    var fileId = gridFsInfo.Id;

    ObjectId oid= new ObjectId(fileId);
    var file = database.GridFS.FindOne(Query.EQ("_id", oid));

    using (var stream = file.OpenRead())
    {
       var bytes = new byte[stream.Length];
       stream.Read(bytes, 0, (int)stream.Length);
       using(var newFs = new FileStream(newFileName, FileMode.Create))
       {
         newFs.Write(bytes, 0, bytes.Length);
       } 
    }
 }
 

Résultats:

Fichier:

Fichier im mongodb

Collection de morceaux:

Collection de morceaux

J'espère que cette aide.

18voto

John Dauphine Points 151

Cet exemple vous permettra de lier un document à un objet

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {

        MongoServer ms = MongoServer.Create();
        string _dbName = "docs";

        MongoDatabase md = ms.GetDatabase(_dbName);
        if (!md.CollectionExists(_dbName))
        {
            md.CreateCollection(_dbName);
        }

        MongoCollection<Doc> _documents = md.GetCollection<Doc>(_dbName);
        _documents.RemoveAll();
        //add file to GridFS

        MongoGridFS gfs = new MongoGridFS(md);
        MongoGridFSFileInfo gfsi = gfs.Upload(@"c:\mongodb.rtf");
        _documents.Insert(new Doc()
        {
            DocId = gfsi.Id.AsObjectId,
            DocName = @"c:\foo.rtf"
        }
        );

        foreach (Doc item in _documents.FindAll())
        {

            ObjectId _documentid = new ObjectId(item.DocId.ToString());
            MongoGridFSFileInfo _fileInfo = md.GridFS.FindOne(Query.EQ("_id", _documentid));
            gfs.Download(item.DocName, _fileInfo);
            Console.WriteLine("Downloaded {0}", item.DocName);
            Console.WriteLine("DocName {0} dowloaded", item.DocName);

        }



        Console.ReadKey();
    }
}

class Doc
{
    public ObjectId Id { get; set; }
    public string DocName { get; set; }
    public ObjectId DocId { get; set; }


}
 

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X