wre2 发表于 2014-9-10 09:17:22

Mongodb存储读取Word文档

    在为人事系统做操作日志功能时,为了保证已经打印的信函可以还原,需要在每次打印信函时记录Word信函的内容。

   SQL Server只能记录信函的文字内容,那信函的页面布局、字体格式等其他内容如何存储呢?此时Mongodb闪亮登场,由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。取的时候再以二进制格式取,这样文档就能实现无损保存。

   下面是我已经验证成功,存储Word到Mongo,然后从Mongo读取Word的代码,在此和大家分享分享。



    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.Bson;
    using MongoDB.Driver;
      
    namespace Mongodb
    {
      public partial class Form1 : Form
      {
            public Form1()
            {
                InitializeComponent();
                Init();
            }
            //数据库连接字符串
            const string strconn = "mongodb://127.0.0.1:27017";
            //数据库名称
            const string dbName = "test";
            MongoServer server;
            MongoDatabase db;
            void Init()
            {
                //创建数据库链接
                server = MongoDB.Driver.MongoServer.Create(strconn);
                //获得数据库
                db = server.GetDatabase(dbName);
            }
      
            private void btnSave_Click(object sender, EventArgs e)
            {
                SaveDocToMongo(@"d:\quwenzhe.docx");
            }
      
            private void btnShow_Click(object sender, EventArgs e)
            {
                GetDocFromMongo(@"E:\newquwenzhe.doc");
            }
      
            /// <summary>
            /// 保存Word到Mongo
            /// </summary>
            /// <param name="filename">需要保存的文件名</param>
            private void SaveDocToMongo(string filename)
            {
                byte[] byteDoc = File.ReadAllBytes(filename);
                BsonDocument doc = new BsonDocument();
                doc["id"] = "1";
                doc["content"] = byteDoc;
                MongoCollection col = db.GetCollection("doc");
                col.Save(doc);
            }
      
            /// <summary>
            /// 将Mongo中的Word保存到本地
            /// </summary>
            /// <param name="filename">保存到本地的文件名</param>
            private void GetDocFromMongo(string filename)
            {
                MongoCollection col = db.GetCollection("doc");
                var query = new QueryDocument { { "id", "1" } };
                var result = col.FindAs<BsonDocument>(query);
                byte[] buff = (byte[])((BsonDocument)result.ToList()).GetValue("content");
                FileStream fs;
                FileInfo fi = new FileInfo(filename);
                fs = fi.OpenWrite();
                fs.Write(buff, 0, buff.Length);
                fs.Close();
            }
      }
    }

    执行完存储操作后,大家可以在MongoVUE中查看存储的二进制数据,如下图所示:
   

   到此大功告成,弱弱的奉上源码下载地址:链接: http://pan.baidu.com/s/10ENpk 密码: v37j

   好了,时间不早了,我得小憩一下,准备下午的软考,谢谢大家观看。
页: [1]
查看完整版本: Mongodb存储读取Word文档