用C#MongoDB GridFs,如何存储图像等文件?
我正在开发一个MongoDB作为我的后端的Web应用程序。 我希望用户可以将图片上传到他们的个人资料中,例如链接的个人资料照片。 我正在使用MVC2的aspx页面,我读了GridFs库用于存储大型文件types作为二进制文件。 我已经到处寻找线索,但是mongodb没有C#api或GridFs C#的任何文档。 我感到困惑和困惑,真的可以使用另一套大脑。
任何人都知道如何真正实现一个file upload控制器,将用户上传的图像存储到一个mongodb集合中? 太感谢了!
我试过这个变化无济于事。
Database db = mongo.getDB("Blog"); GridFile file = new GridFile(db); file.Create("image.jpg"); var images = db.GetCollection("images"); images.Insert(file.ToDocument());
下面的例子显示了如何保存文件并从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); } } }
结果:
文件:
大块收集:
希望这个帮助。
这个例子将允许你将一个文档绑定到一个对象
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; } }
上面的答案很快就会过时了,现在2.1 RC-0驱动已经发布了。
现在可以通过以下方式来处理2.1版MongoDB中使用GridFS中的文件:
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#驱动程序testing差异