zoukankan      html  css  js  c++  java
  • 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:	empyl.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

  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/jordan2009/p/3661692.html
Copyright © 2011-2022 走看看