• 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

  • 相关阅读:
    工具资源系列之给 windows 虚拟机装个 mac
    工具资源系列之 github 上各式各样的小徽章从何而来?
    php 学习笔记之日期时间操作一箩筐
    2018-12-03 VS Code英汉词典插件v0.0.7-尝试词性搭配
    2018-11-29 VS Code英汉词典插件v0.0.6-改为TS实现, 加测试
    2018-11-27 中文代码示例之Programming in Scala笔记第七八章
    2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本
    2018-11-21 手工翻译Vue.js源码第一步:14个文件重命名
    2018-11-16 中文代码示例之Programming in Scala笔记第四五六章
    2018-11-13 中文代码示例之Programming in Scala学习笔记第二三章
  • 原文地址:https://www.cnblogs.com/jordan2009/p/3661692.html
Copyright © 2020-2023  润新知