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

  • 相关阅读:
    jQuery取得select选择的文本与值
    jquery 广告效果
    【JNI知识一】JNI接口函数与指针
    jQuery 中bind(),live(),delegate(),on() 区别(转)
    用angular怎么缓存父页面数据
    js条件判断时隐式类型转换
    常用原生JS方法
    gulp批量打包文件并提取公共文件
    angular下H5上传图片(可预览,可多张上传)
    angular4运行 ng build prod出错
  • 原文地址:https://www.cnblogs.com/jordan2009/p/3661692.html
Copyright © 2011-2022 走看看