C# 玩转MongoDB(二)

  • A+
所属分类:.NET技术
摘要

在前一篇文章中,已经简述了如何通过C#进行MongoDB基本数据类型的存储及读取,那么文件如何在MongoDB中进行存储呢?本文主要以一个简单的小例子,简述如何通过MongoDB进行图片文件的存储及读写,仅供学习分享使用,如有不足之处,还请指正。

在前一篇文章中,已经简述了如何通过C#进行MongoDB基本数据类型的存储及读取,那么文件如何在MongoDB中进行存储呢?本文主要以一个简单的小例子,简述如何通过MongoDB进行图片文件的存储及读写,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

MongoDB有一种数据类型Binary,主要用于存储二进制数据,所以我们可以利用二进制进行一些小文件(<16M)的存储。本文主要通过将图片转换成二进制数据,然后再保存在MongoDB中,读取时再将二进制文件转换成图片予以展示。

示例截图

示例虽小,但已包含了对MongoDB的增删改查,具体如下:

1. 本例主要是将MongoDB中的图片信息读取并展示成列表,然后选择列表中的名称,并展示图片明细。

2. 通过新增功能往数据库中保存图片。

查询功能

C# 玩转MongoDB(二)

 新增功能

C# 玩转MongoDB(二)

 核心代码

关于前文提到的MongoHelper类是可以通用的,无需做任何修改,此处不再赘述,可参考前一篇文章。首先新增一个图片Model类,定义数据结构,如下所示:

 1 using MongoDB.Bson;  2 using System;  3 using System.Collections.Generic;  4 using System.Linq;  5 using System.Text;  6 using System.Threading.Tasks;  7   8 namespace DemoMongo  9 { 10     public class Photo 11     { 12         /// <summary> 13         /// 唯一ID 14         /// </summary> 15         public ObjectId Id { get; set; } 16  17         /// <summary> 18         /// 图片名称 19         /// </summary> 20         public string name { get; set; } 21  22         /// <summary> 23         /// 图片类型 24         /// </summary> 25         public string suffix { get; set; } 26  27         /// <summary> 28         /// 图片大小 29         /// </summary> 30         public int size { get; set; } 31  32         /// <summary> 33         /// 图片内容 34         /// </summary> 35         public byte[] content { get; set; } 36     } 37 }

保存时读取图片的二进制数据,赋值给Phtoto,然后进行保存即可,如下所示:

 1        /// <summary>  2         /// 保存  3         /// </summary>  4         /// <param name="sender"></param>  5         /// <param name="e"></param>  6         private void btnSave_Click(object sender, EventArgs e)  7         {  8             string filePath = this.txtPath.Text;  9             if (!string.IsNullOrEmpty(filePath)) 10             { 11                 FileInfo info = new FileInfo(filePath); 12  13                 Photo photo = new Photo() 14                 { 15                     Id = ObjectId.GenerateNewId(DateTime.Now), 16                     name = Path.GetFileName(filePath), 17                     suffix = Path.GetExtension(filePath), 18                     size = int.Parse(info.Length.ToString()), 19                     content = File.ReadAllBytes(filePath) 20                 }; 21                 this.helper.Insert(photo); 22                 MessageBox.Show("插入成功"); 23             } 24             else { 25                 MessageBox.Show("请先选择文件"); 26             } 27         }

读取时,将二进制数据转换成图片,并在PictureBox上展示,如下所示:

 1         private void dgView_CellClick(object sender, DataGridViewCellEventArgs e)  2         {  3             //只有当第0列被点击时才生效  4             if (e.ColumnIndex == 0)  5             {  6                 byte[] content = ((Photo)dgView.CurrentRow.DataBoundItem).content;  7                 MemoryStream ms = new MemoryStream(content);  8                 this.pbContent.Image=Image.FromStream(ms);  9                 this.pbContent.SizeMode = PictureBoxSizeMode.StretchImage; 10             } 11         }

MongoDB数据示例

在MongoDB中,数据存储如下所示:

C# 玩转MongoDB(二)

 

 以上就是将图片文件保存到MongoDB中的相关代码,旨在抛砖引玉,共同进步,关于大文件的存储,可在下一篇讲解。

备注

木兰花·燕鸿过后莺归去

【作者】晏殊 【朝代】宋
 
燕鸿过后莺归去。细算浮生千万绪。长于春梦几多时,散似秋云无觅处。
闻琴解佩神仙侣。挽断罗衣留不住。劝君莫作独醒人,烂醉花间应有数。
C# 玩转MongoDB(二)