MongodDB用GridFS方式存取文件

在实现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

posted on 2014-04-13 01:18  米高佐敦  阅读(1608)  评论(0编辑  收藏  举报