在实现GridFS方式前我先讲讲它的原理,为什么可以存大文件。驱动首先会在当前数据库创建两个集合:"fs.files"和"fs.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。分块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么知道它对应的文件二进制数据在哪些块呢?那是因为在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int型)"n",它表明这些块的先后顺序。这两个集合名中的"fs"也是可以通过参数自定义的。
(我想起了Sql
Server的FileStream)
如果你只是想知道怎么用,可以忽略上面这段话,下面将用法:
这里引用了两个第三方dll,可以到https://github.com/samus/mongodb-csharp下载,编译后得到。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using MongoDB; using MongoDB.GridFS; namespace mongotest { public partial class Form2 : Form { public Form2() { InitializeComponent(); Init(); } private void btnGridFSSave_Click(object sender, EventArgs e) { byte[] byteImg = File.ReadAllBytes(@"c:\temp\yl.jpg"); filename = GridFsSave(byteImg); MessageBox.Show(filename); } private void btnGridFSShow_Click(object sender, EventArgs e) { byte[] buff = GridFsRead(filename); MemoryStream MS = new MemoryStream(buff); pictureBox1.Image = Image.FromStream(MS); } private Mongo mongo; private IMongoDatabase test; string filename; void Init() { var connstr = @"Server=localhost:27017"; mongo = new Mongo(connstr); mongo.Connect(); test = mongo["test"]; } private string GridFsSave(byte[] byteFile) { string filename = Guid.NewGuid().ToString(); //这里GridFile构造函数有个重载,bucket参数就是用来替换那个创建集合名中默认的"fs"的。 GridFile gridFile = new GridFile(test); using (GridFileStream gridFileStream = gridFile.Create(filename)) { gridFileStream.Write(byteFile, 0, byteFile.Length); } return filename; } private byte[] GridFsRead(string filename) { GridFile gridFile = new GridFile(test); GridFileStream gridFileStream = gridFile.OpenRead(filename); byte[] bytes = new byte[gridFileStream.Length]; gridFileStream.Read(bytes, 0, bytes.Length); return bytes; } } }
存储在数据库中如图:
参考文章:
http://www.cnblogs.com/lipan/archive/2011/03/21/1989409.html