2011-02-14 13 views
60

私はmongodbをバックエンドとしてWebアプリケーションを開発しています。私は、ユーザーにプロファイルにリンクされた写真のような写真をアップロードさせたいと思っています。私はMVC2でaspxページを使用していますが、GridFsライブラリはバイナリとして大きなファイルタイプを格納するために使用されています。私はこれがどのように行われたかの手がかりをどこからでも見てきましたが、mongodbにはC#apiやGridFs C#に関するドキュメントはありません。私はうんざりして混乱していて、本当に別の脳を使うことができます。C#でMongoDB GridFs、画像などのファイルを保存するには?

ユーザーがアップロードしたイメージをmongodbコレクションに保存するファイルアップロードコントローラを実際に実装する方法を知っている人は誰ですか?感謝万円!

私はこのような変形を無駄に試しました。たとえば以下の

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

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

HTTPS上の差分から撮影されています:

GridFSとV2.1のMongoDBの内のファイルで作業する方法は、今この方法を行うことができます// stackoverflow.com/questions/45535296/how-to-create-a-cdn-server-in-dotnet-core-using-mongodb-gridfs-and-angularjs?noredirect=1#comment78034138_45535296 –

答えて

84

は(公式MongoDBのドライバを使用して)ファイルを保存し、gridfsからリードバックする方法を示しています。

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

結果:

ファイル:

File im mongodb

チャンクコレクション:

Chunks collection

は、このヘルプを願っています。

+1

Andrew、あなたは何を閲覧するために使用しますか結果?スクリーンショットはどのプログラムから来ますか? Look alot lite SQLマネージャ。 – Goff

+8

@Goff:mongovue - > http://www.mongovue.com/です。 –

+0

Andrew、MongoDbは大容量のファイルを格納するために小さなまとまりに分割するので、部分的な格納に使用して後で再開することができますか?誰かがMongoDBにデスクトップバックアップクラウドアプリケーションを書いているとします。そこにはファイルが自動的にバックアップされます。ここで、ファイルの70%がバックアップを完了したときに、PDFファイルがバックアップされているとします(私はWindowsでファイルを1つのドライブから別のドライブにコピーすると言うと、 %done 'という種類のメッセージ)、ユーザーは切断します。彼が再び接続すると、70%の情報を使ってバックアップを中断した場所から再開することができます – SexyBeast

17

この例では、上記の答えは2.1 RC-0ドライバがリリースされていることを今時代遅れであることをすぐにあるオブジェクト

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

に文書を結びつけることができます。

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<ObjectId>(() => { return 
        fs.UploadFromStreamAsync("test.txt", s); 
       }); 

       return t.Result; 
      } 
     } 

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


      //This blows chunks (I think it's a driver bug, I'm using 2.1 RC-0) 
      var x = fs.DownloadAsBytesAsync(id); 
      Task.WaitAll(x); 
     } 
    } 
} 

これは、C#のドライバーテストhere

+0

私はコードを試しませんでした。それは動作しますか?あなたはそれが塊を爆破したと言った –

+0

良い質問。明確にするために、最初の呼び出し、DownloadAsBytesByNameAsyncは正常に動作します。 2番目の呼び出しは失敗します。しかし、DownloadAsBytesAsyncが機能するためには、nullable CancellationToken引数が含まれていなければならず、nullでないことが示されています。 – Josh

+0

レスポンスのThx。ファイルアップロードの同期メソッドがダウンロードできますか? –

関連する問題