2011-02-14 19 views
60

मैं अपने बैक-एंड के रूप में मोंगोडब के साथ एक वेब ऐप विकसित कर रहा हूं। मैं उपयोगकर्ताओं को अपनी प्रोफाइल में एक लिंक-इन प्रोफाइल तस्वीर की तरह चित्र अपलोड करना चाहता हूं। मैं एमवीसी 2 के साथ एक एएसपीएक्स पेज का उपयोग कर रहा हूं और मैंने पढ़ा है कि ग्रिडएफएस लाइब्रेरी का उपयोग बड़ी फाइल प्रकारों को बाइनरी के रूप में स्टोर करने के लिए किया जाता है। मैंने सुराग के लिए हर जगह देखा है कि यह कैसे किया जाता है, लेकिन मोंगोडब में सी # एपीआई या ग्रिडएफ सी # के लिए कोई दस्तावेज नहीं है। मैं परेशान और उलझन में हूं, वास्तव में दिमाग के दूसरे सेट का उपयोग कर सकता हूं।सीओ # के साथ मोंगोडीबी ग्रिडएफ, छवियों जैसे फाइलों को कैसे स्टोर करें?

कोई भी व्यक्ति वास्तव में एक फ़ाइल अपलोड नियंत्रक को कार्यान्वित करने के बारे में जानता है जो किसी उपयोगकर्ता द्वारा एक मोंगोड संग्रह में अपलोड की गई छवि को संग्रहीत करता है? बहुत - बहुत धन्यवाद!

मैंने इसका कोई फायदा नहीं उठाया है।

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 पर एक diff से लिया जाता है:

रास्ता 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

फ़ाइल को सहेजने और gridfs (सरकारी 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); 
     } 
    } 
} 

परिणाम:

फ़ाइल:

File im mongodb

भाग संग्रह:

Chunks collection

आशा इस मदद करते हैं।

+1

एंड्रयू, आप देखने के लिए क्या उपयोग करते हैं परिणाम? स्क्रीनशॉट से कौन से कार्यक्रम हैं? बहुत लाइट एसक्यूएल प्रबंधक लगता है। – Goff

+8

@ गॉफ: यह mongovue है -> http://www.mongovue.com/। –

+0

एंड्रयू, एक प्रश्न, चूंकि मोंगोडेब बड़ी फ़ाइलों को भंडारण के लिए छोटे हिस्सों में तोड़ देता है, क्या इसका आंशिक भंडारण के लिए उपयोग किया जा सकता है और बाद में फिर से शुरू किया जा सकता है? मान लें कि कोई मोंगोडीबी में डेस्कटॉप बैकअप क्लाउड ऐप लिख रहा है, जहां फाइलों का स्वचालित रूप से बैकअप लिया जाता है। अब मान लीजिए कि एक पीडीएफ फाइल का बैक अप लिया जा रहा है, जब 70% फाइल का बैक अप पूरा हो गया है (मैं ओएस में फाइल कॉपी करने के समानता में बात कर रहा हूं, कहें कि जब हम विंडोज़ में एक ड्राइव से दूसरी ड्राइव में फाइल कॉपी करते हैं, तो '60 % किया 'संदेश का प्रकार), उपयोगकर्ता डिस्कनेक्ट करता है। जब वह दोबारा जुड़ता है, तो क्या 70% जानकारी बैकअप को फिर से शुरू करने के लिए उपयोग की जा सकती है, जहां से यह – SexyBeast

17

यह उदाहरण आप एक वस्तु

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

ऊपर जवाब जल्द ही कर रहे हैं कि अब 2.1 आर सी -0 चालक जारी की गई है पुराना हो करने के लिए कोई दस्तावेज़ टाई करने की अनुमति देगा।

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

यह सी # चालक परीक्षण here

+0

छोड़ दिया गया था, मैंने कोड को आजमाया नहीं था। क्या यह काम करता है? आपने कहा कि यह –

+0

अच्छा सवाल है। स्पष्टीकरण के लिए, पहली कॉल, DownloadAsBytesByNameAsync, ठीक काम करता है। दूसरा कॉल विफल रहता है। लेकिन एक सुझाव दिया गया था जो दिखाता है कि DownloadAsBytesAsync को निरर्थक रद्द करने के लिए रद्द करने के लिए टोकन तर्क शामिल होना चाहिए और शून्य नहीं होना चाहिए। प्रतिक्रिया के लिए – Josh

+0

Thx। फ़ाइल अपलोड डाउनलोड के लिए सिंक्रोनस विधियां हैं? –