68 Stimmen

MongoDB GridFs mit C#, wie speichert man Dateien wie Bilder?

Ich entwickle eine Webanwendung mit MongoDB als Backend. Ich möchte, dass Benutzer Bilder in ihre Profile hochladen können, wie ein Profilbild bei LinkedIn. Ich verwende eine ASPX-Seite mit MVC2 und habe gelesen, dass die GridFs-Bibliothek verwendet wird, um große Dateitypen als Binärdateien zu speichern. Ich habe überall nach Hinweisen gesucht, wie das gemacht wird, aber MongoDB hat keine Dokumentation für die C#-API oder GridFs in C#. Ich bin verwirrt und verwirrt, könnte wirklich ein weiteres Gehirn gebrauchen.

Weiß jemand, wie man tatsächlich einen Datei-Upload-Controller implementiert, der ein Bild hochlädt, das von einem Benutzer in einer MongoDB-Sammlung gespeichert wird? Vielen Dank!

Ich habe verschiedene Variationen davon ausprobiert, jedoch ohne Erfolg.

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 Punkte 51107

Das folgende Beispiel zeigt, wie man eine Datei speichert und aus GridFS zurückliest (unter Verwendung des offiziellen MongoDB-Treibers):

 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);
       } 
    }
 }

Ergebnisse:

Datei:

Datei in MongoDB

Chunks-Kollektion:

Chunks-Kollektion

Ich hoffe, das hilft.

20voto

Josh Punkte 2323

Die oben genannten Antworten werden bald veraltet sein, da der Treiber 2.1 RC-0 veröffentlicht wurde.

Die Möglichkeit, mit Dateien in v2.1 MongoDB mit GridFS zu arbeiten, kann jetzt folgendermaßen erfolgen:

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using System.IO;
using System.Threading.Tasks;

namespace MongoGridFSTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new MongoClient("mongodb://localhost");
            var database = client.GetDatabase("TestDB");
            var fs = new GridFSBucket(database);

            var id = UploadFile(fs);

            DownloadFile(fs, id);
        }

        private static ObjectId UploadFile(GridFSBucket fs)
        {
            using (var s = File.OpenRead(@"c:\temp\test.txt"))
            {
                var t = Task.Run(() => { return 
                    fs.UploadFromStreamAsync("test.txt", s);
                });

                return t.Result;
            }
        }

        private static void DownloadFile(GridFSBucket fs, ObjectId id)
        {
            //Dies funktioniert
            var t = fs.DownloadAsBytesByNameAsync("test.txt");
            Task.WaitAll(t);
            var bytes = t.Result;

            //Dies stößt auf Probleme (Ich denke, es handelt sich um einen Treiberfehler, ich verwende 2.1 RC-0)
            var x = fs.DownloadAsBytesAsync(id);
            Task.WaitAll(x);
        }
    }
}

Dies stammt aus einem Diff der C#-Treiber-Tests hier

19voto

John Dauphine Punkte 311

Dieses Beispiel ermöglicht es Ihnen, ein Dokument an ein Objekt zu binden

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 _documents = md.GetCollection(_dbName);
        _documents.RemoveAll();
        //Datei zu GridFS hinzufügen

        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("Heruntergeladen {0}", item.DocName);
            Console.WriteLine("DocName {0} heruntergeladen", item.DocName);
        }

        Console.ReadKey();
    }
}

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X