百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 网站模板(百分百源码网)>电脑软件>服务器> MongoDB学习笔记(五) MongoDB文件存取操纵
分享本文到:

MongoDB学习笔记(五) MongoDB文件存取操纵

发布时间:05/16 来源:未知 浏览: 关键词:

因为MongoDB的文档构造为BJSON格局(BJSON全称:Binary JSON),而BJSON格局自身就支撑保留二进制格局的数据,因而可以把文件的二进制格局的数据直接保留到MongoDB的文档构造中。但是因为一个BJSON的最大长度不能超过4M,所以限定了单个文档中能存入的最大文件不能超过4M。为了供给对大容量文件存取的支撑,samus驱动供给了“GridFS”方式来支撑,“GridFS”方式文件操纵需要引入新的程序集“MongoDB.GridFS.dll”。下面我们离别用两种方式来实现。

一、在文档对象中存取文件

  当文件大小较小的时候,直接存入文档对象实现起来更简约。比方大量图片文件的存取等,个别图片文件都不会超过4M。我们先实现一个上传图片存入数据库,再掏出来写回页面的例子:

   1. 把图片存到BJSON中

复制代码 代码如下:

/// <summary>
/// 把图片存到BJSON中
/// </summary>
public void SaveImgBJSON(byte[] byteImg)
{
    Document doc = new Document();
    doc["ID"] = 1;
    doc["Img"] = byteImg;
    mongoCollection.Save(doc);
}

2. 获取BJSON方式存储的图片字节数据

复制代码 代码如下:

/// <summary>
/// 获取BJSON方式存储的图片字节数据
/// </summary>
public byte[] GetImgBJSON()
{
  Document doc=  mongoCollection.FindOne(new Document { { "ID", 1 } });
  return doc["Img"] as Binary;
}


上面两段代码是在对MongoDB相干操纵进行BLL封装类中增加的两个要领,封装方式查看上节内容。下面看看在webform中怎样调用:

  在界面拖出一个FileUpload控件和一个Button控件,页面cs类加如下要领:

复制代码 代码如下:

protected void Button1_Click(object sender, EventArgs e)
{
    ImgBLL imgBll = new ImgBLL();
    imgBll.DeleteAll();
    imgBll.SaveImgBJSON(FileUpload1.FileBytes);
    Response.BinaryWrite(imgBll.GetImgBJSON());
}

二、用GridFS方式存取文件

  在实现GridFS方式前我先讲讲它的道理,为何可以存大文件。驱动首先会在目前数据库新建两个汇合:"fs.files"和"fs.chunks"汇合,前者记载了文件名,文件新建工夫,文件类型等根本信息;后者分块存储了文件的二进制数据(并支撑加密这些二进制数据)。分块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么晓得它对应的文件二进制数据在哪些块呢?那是由于在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int型)"n",它表明这些块的前后次序。这两个汇合名中的"fs"也是可以通过参数自定义的。

  要是你只是想晓得怎么用,可以忽略上面这段话,下面将用法:

   1. GridFS方式的文件创建,读取,删除

复制代码 代码如下:

private string GridFsSave(byte[] byteFile)
{
    string filename = Guid.NewGuid().ToString();

    //这里GridFile结构函数有个重载,bucket参数就是用来替代那个新建汇合名中默许的"fs"的。
    GridFile gridFile = new GridFile(mongoDatabase);
    using (GridFileStream gridFileStream = gridFile.Create(filename))
    {
        gridFileStream.Write(byteFile, 0, byteFile.Length);
    }
    return filename;
}

private byte[] GridFsRead(string filename)
{
    GridFile gridFile = new GridFile(mongoDatabase);
    GridFileStream gridFileStream = gridFile.OpenRead(filename);
    byte[] bytes = new byte[gridFileStream.Length];
    gridFileStream.Read(bytes, 0, bytes.Length);
    return bytes;
}

private void GridFsDelete(string filename)
{
    GridFile gridFile = new GridFile(mongoDatabase);
    gridFile.Delete(new Document("filename", filename));
}

2. 再次封装GridFS操纵,新文档只存储文件名称,相当于只是一个键,新文档还可以有除“文件名”以外其他的键。

复制代码 代码如下:

/// <summary>
/// 把图片存到GridFS中
/// </summary>
public void SaveImgGridFS(byte[] byteImg)
{
    string filename = GridFsSave(byteImg);

    Document doc = new Document();
    doc["ID"] = 1;
    doc["filename"] = filename;
    mongoCollection.Save(doc);
}

/// <summary>
/// 获取GridFS方式存储的图片
/// </summary>
public byte[] GetImgGridFS()
{
    Document doc = mongoCollection.FindOne(new Document { { "ID", 1 } });
    string filename = doc["filename"].ToString();
    return GridFsRead(filename);
}

三、小结

  文件存取应当不是很难,值得注意的地方是:用第一种方式从文档中读出二进制数据时,一定要将类型转换为“Binary”类型;还有系统自带的键“_id”,它也不是string类型,是“Oid”类型的。

作者:李盼(Lipan)
出处:[Lipan] (http://www.cnblogs.com/lipan/)

热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板
责任编辑:gA4Dd
打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有152人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助



订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板