MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查

 更新时间:2020年04月10日 11:31:01   作者:天风隼  
这篇文章主要为大家详细介绍了使用MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了针对Mongodb3.3数据库中GridFS增删改查,供大家参考,具体内容如下

Program.cs代码如下:

internal class Program 
 { 
 private static void Main(string[] args) 
 { 
  GridFSHelper helper = new GridFSHelper("mongodb://localhost", "GridFSDemo", "Pictures"); 
 
  #region 上传图片 
 
  //第一种 
  //Image image = Image.FromFile("D:\\dog.jpg"); 
  //byte[] imgdata = ImageHelper.ImageToBytes(image); 
  //ObjectId oid = helper.UploadGridFSFromBytes(imgdata); 
 
  //第二种 
  //Image image = Image.FromFile("D:\\man.jpg"); 
  //Stream imgSteam = ImageHelper.ImageToStream(image); 
  //ObjectId oid = helper.UploadGridFSFromStream("man",imgSteam); 
  //LogHelper.WriteFile(oid.ToString()); 
  // Console.Write(oid.ToString()); 
 
  #endregion 
 
  #region 下载图片 
 
  //第一种 
  //ObjectId downId = new ObjectId("578e2d17d22aed1850c7855d"); 
  //byte[] Downdata= helper.DownloadAsByteArray(downId); 
  //string name= ImageHelper.CreateImageFromBytes("coolcar",Downdata); 
 
  //第二种 
  // byte[] Downdata = helper.DownloadAsBytesByName("QQQ"); 
  //string name = ImageHelper.CreateImageFromBytes("dog", Downdata); 
 
  //第三种 
  //byte[] Downdata = helper.DownloadAsBytesByName("QQQ"); 
  //Image img = ImageHelper.BytesToImage(Downdata); 
  //string path = Path.GetFullPath(@"../../DownLoadImg/") + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg"; 
  ////使用path获取当前应用程序集的执行目录的上级的上级目录 
  //img.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg); 
 
  #endregion 
 
  #region 查找图片 
  GridFSFileInfo gridFsFileInfo = helper.FindFiles("man"); 
  Console.WriteLine(gridFsFileInfo.Id); 
  #endregion 
 
  #region 删除图片 
  //helper.DroppGridFSBucket(); 
  #endregion 
 
  Console.ReadKey(); 
 } 
 } 

GridFSHelper.cs的代码如下:

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using MongoDB.Bson; 
using MongoDB.Driver; 
using MongoDB.Driver.GridFS; 
 
namespace MongoDemo 
{ 
 public class GridFSHelper 
 { 
 private readonly IMongoClient client; 
 private readonly IMongoDatabase database; 
 private readonly IMongoCollection<BsonDocument> collection; 
 private readonly GridFSBucket bucket; 
 private GridFSFileInfo fileInfo; 
 private ObjectId oid; 
 
 public GridFSHelper() 
  : this( 
  ConfigurationManager.AppSettings["mongoQueueUrl"], ConfigurationManager.AppSettings["mongoQueueDb"], 
  ConfigurationManager.AppSettings["mongoQueueCollection"]) 
 { 
 } 
 
 public GridFSHelper(string url, string db, string collectionName) 
 { 
  if (url == null) 
  { 
  throw new ArgumentNullException("url"); 
  } 
  else 
  { 
  client = new MongoClient(url); 
  } 
 
  if (db == null) 
  { 
  throw new ArgumentNullException("db"); 
  } 
  else 
  { 
  database = client.GetDatabase(db); 
  } 
 
  if (collectionName == null) 
  { 
  throw new ArgumentNullException("collectionName"); 
  } 
  else 
  { 
  collection = database.GetCollection<BsonDocument>(collectionName); 
  } 
 
  //this.collection = new MongoClient(url).GetDatabase(db).GetCollection<BsonDocument>(collectionName); 
 
  GridFSBucketOptions gfbOptions = new GridFSBucketOptions() 
  { 
  BucketName = "bird", 
  ChunkSizeBytes = 1*1024*1024, 
  ReadConcern = null, 
  ReadPreference = null, 
  WriteConcern = null 
  }; 
  var bucket = new GridFSBucket(database, new GridFSBucketOptions 
  { 
  BucketName = "videos", 
  ChunkSizeBytes = 1048576, // 1MB 
  WriteConcern = WriteConcern.WMajority, 
  ReadPreference = ReadPreference.Secondary 
  }); 
  this.bucket = new GridFSBucket(database, null); 
 } 
 
 public GridFSHelper(IMongoCollection<BsonDocument> collection) 
 { 
  if (collection == null) 
  { 
  throw new ArgumentNullException("collection"); 
  } 
  this.collection = collection; 
  this.bucket = new GridFSBucket(collection.Database); 
 } 
 
 
 public ObjectId UploadGridFSFromBytes(string filename, Byte[] source) 
 { 
  oid = bucket.UploadFromBytes(filename, source); 
  return oid; 
 } 
 
 public ObjectId UploadGridFSFromStream(string filename,Stream source) 
 { 
  using (source) 
  { 
  oid = bucket.UploadFromStream(filename, source); 
  return oid; 
  } 
 } 
 
 public Byte[] DownloadAsByteArray(ObjectId id) 
 { 
  Byte[] bytes = bucket.DownloadAsBytes(id); 
  return bytes; 
 } 
 
 public Stream DownloadToStream(ObjectId id) 
 { 
  Stream destination = new MemoryStream(); 
  bucket.DownloadToStream(id, destination); 
  return destination; 
 } 
 
 public Byte[] DownloadAsBytesByName(string filename) 
 { 
  Byte[] bytes = bucket.DownloadAsBytesByName(filename); 
  return bytes; 
 } 
 
 public Stream DownloadToStreamByName(string filename) 
 { 
  Stream destination = new MemoryStream(); 
  bucket.DownloadToStreamByName(filename, destination); 
  return destination; 
 } 
 
 public GridFSFileInfo FindFiles(string filename) 
 { 
  var filter = Builders<GridFSFileInfo>.Filter.And( 
  Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "man"), 
  Builders<GridFSFileInfo>.Filter.Gte(x => x.UploadDateTime, new DateTime(2015, 1, 1, 0, 0, 0, DateTimeKind.Utc)), 
  Builders<GridFSFileInfo>.Filter.Lt(x => x.UploadDateTime, new DateTime(2017, 2, 1, 0, 0, 0, DateTimeKind.Utc))); 
  var sort = Builders<GridFSFileInfo>.Sort.Descending(x => x.UploadDateTime); 
  var options = new GridFSFindOptions 
  { 
  Limit = 1, 
  Sort = sort 
  }; 
  using (var cursor = bucket.Find(filter, options)) 
  { 
   fileInfo = cursor.ToList().FirstOrDefault(); 
  } 
  return fileInfo; 
 } 
 
 
 public void DeleteAndRename(ObjectId id) 
 { 
  bucket.Delete(id); 
 } 
 
 //The “fs.files” collection will be dropped first, followed by the “fs.chunks” collection. This is the fastest way to delete all files stored in a GridFS bucket at once. 
 public void DroppGridFSBucket() 
 { 
  bucket.Drop(); 
 } 
 
 public void RenameAsingleFile(ObjectId id,string newFilename) 
 { 
  bucket.Rename(id, newFilename); 
 } 
 
 public void RenameAllRevisionsOfAfile(string oldFilename,string newFilename) 
 { 
  var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, oldFilename); 
  var filesCursor = bucket.Find(filter); 
  var files = filesCursor.ToList(); 
  foreach (var file in files) 
  { 
  bucket.Rename(file.Id, newFilename); 
  } 
 } 
 
 } 
} 

ImageHelper.cs的代码如下:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
 
namespace MongoDemo 
{ 
 public static class ImageHelper 
 { 
 /// <summary> 
 /// //将Image转换成流数据,并保存为byte[] 
 /// </summary> 
 /// <param name="image"></param> 
 /// <returns></returns> 
 public static byte[] ImageToBytes(Image image) 
 { 
  ImageFormat format = image.RawFormat; 
  using (MemoryStream ms = new MemoryStream()) 
  { 
  if (format.Equals(ImageFormat.Jpeg)) 
  { 
   image.Save(ms, ImageFormat.Jpeg); 
  } 
  else if (format.Equals(ImageFormat.Png)) 
  { 
   image.Save(ms, ImageFormat.Png); 
  } 
  else if (format.Equals(ImageFormat.Bmp)) 
  { 
   image.Save(ms, ImageFormat.Bmp); 
  } 
  else if (format.Equals(ImageFormat.Gif)) 
  { 
   image.Save(ms, ImageFormat.Gif); 
  } 
  else if (format.Equals(ImageFormat.Icon)) 
  { 
   image.Save(ms, ImageFormat.Icon); 
  } 
  byte[] buffer = new byte[ms.Length]; 
  //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin 
  ms.Seek(0, SeekOrigin.Begin); 
  ms.Read(buffer, 0, buffer.Length); 
  return buffer; 
  } 
 } 
 
 
 public static Stream ImageToStream(Image image) 
 { 
  ImageFormat format = image.RawFormat; 
  MemoryStream ms = new MemoryStream(); 
 
  if (format.Equals(ImageFormat.Jpeg)) 
  { 
  image.Save(ms, ImageFormat.Jpeg); 
  } 
  else if (format.Equals(ImageFormat.Png)) 
  { 
  image.Save(ms, ImageFormat.Png); 
  } 
  else if (format.Equals(ImageFormat.Bmp)) 
  { 
  image.Save(ms, ImageFormat.Bmp); 
  } 
  else if (format.Equals(ImageFormat.Gif)) 
  { 
  image.Save(ms, ImageFormat.Gif); 
  } 
  else if (format.Equals(ImageFormat.Icon)) 
  { 
  image.Save(ms, ImageFormat.Icon); 
  } 
  return ms; 
 } 
 
 //参数是图片的路径 
 public static byte[] GetPictureData(string imagePath) 
 { 
  FileStream fs = new FileStream(imagePath, FileMode.Open); 
  byte[] byteData = new byte[fs.Length]; 
  fs.Read(byteData, 0, byteData.Length); 
  fs.Close(); 
  return byteData; 
 } 
 
 
 
 /// <summary> 
 /// Convert Byte[] to Image 
 /// </summary> 
 /// <param name="buffer"></param> 
 /// <returns></returns> 
 public static Image BytesToImage(byte[] buffer) 
 { 
  MemoryStream ms = new MemoryStream(buffer); 
  Image image = System.Drawing.Image.FromStream(ms); 
  return image; 
 } 
 
 /// <summary> 
 /// Convert Byte[] to a picture and Store it in file 
 /// </summary> 
 /// <param name="fileName"></param> 
 /// <param name="buffer"></param> 
 /// <returns></returns> 
 public static string CreateImageFromBytes(string fileName, byte[] buffer) 
 { 
  string file = fileName; 
  Image image = BytesToImage(buffer); 
  ImageFormat format = image.RawFormat; 
  if (format.Equals(ImageFormat.Jpeg)) 
  { 
  file += ".jpg"; 
  } 
  else if (format.Equals(ImageFormat.Png)) 
  { 
  file += ".png"; 
  } 
  else if (format.Equals(ImageFormat.Bmp)) 
  { 
  file += ".bmp"; 
  } 
  else if (format.Equals(ImageFormat.Gif)) 
  { 
  file += ".gif"; 
  } 
  else if (format.Equals(ImageFormat.Icon)) 
  { 
  file += ".icon"; 
  } 
  System.IO.FileInfo info = new System.IO.FileInfo(Path.GetFullPath(@"DownLoadImg\")); //在当前程序集目录中添加指定目录DownLoadImg 
  System.IO.Directory.CreateDirectory(info.FullName); 
  File.WriteAllBytes(info+file, buffer); 
  return file; 
 } 
 } 
} 

LogHelper.cs代码如下:

/// <summary> 
 /// 手动记录错误日志,不用Log4Net组件 
 /// </summary> 
 public class LogHelper 
 { 
 /// <summary> 
 /// 将日志写入指定的文件 
 /// </summary> 
 /// <param name="Path">文件路径,如果没有该文件,刚创建</param> 
 /// <param name="content">日志内容</param> 
 public static void WriteFile(string content) 
 { 
  string Path = AppDomain.CurrentDomain.BaseDirectory + "Log"; 
  if (!Directory.Exists(Path)) 
  { 
  //若文件目录不存在 则创建 
  Directory.CreateDirectory(Path); 
  } 
  Path += "\\" + DateTime.Now.ToString("yyMMdd") + ".log"; 
  if (!File.Exists(Path)) 
  { 
  File.Create(Path).Close(); 
  } 
  StreamWriter writer = new StreamWriter(Path, true, Encoding.GetEncoding("gb2312")); 
  writer.WriteLine("时间:" + DateTime.Now.ToString()); 
  writer.WriteLine("日志信息:" + content); 
  writer.WriteLine("-----------------------------------------------------------"); 
  writer.Close(); 
  writer.Dispose(); 
 } 
 
 /// <summary> 
 /// 将日志写入指定的文件 
 /// </summary> 
 /// <param name="Path">文件路径,如果没有该文件,刚创建</param> 
 /// <param name="content">日志内容</param> 
 public static void WriteFile(int content) 
 { 
  string Path = AppDomain.CurrentDomain.BaseDirectory + "Log"; 
  if (!Directory.Exists(Path)) 
  { 
  //若文件目录不存在 则创建 
  Directory.CreateDirectory(Path); 
  } 
  Path += "\\" + DateTime.Now.ToString("yyMMdd") + ".log"; 
  if (!File.Exists(Path)) 
  { 
  File.Create(Path).Close(); 
  } 
  StreamWriter writer = new StreamWriter(Path, true, Encoding.GetEncoding("gb2312")); 
  writer.WriteLine("时间:" + DateTime.Now.ToString()); 
  writer.WriteLine("日志信息:" + content); 
  writer.WriteLine("-----------------------------------------------------------"); 
  writer.Close(); 
  writer.Dispose(); 
 } 
 
 
 /// <summary> 
 /// 将日志写入指定的文件 
 /// </summary> 
 /// <param name="erroMsg">错误详细信息</param> 
 /// <param name="source">源位置</param> 
 /// <param name="fileName">文件名</param> 
 public static void WriteFile(string erroMsg, string source, string stackTrace, string fileName) 
 { 
  string Path = AppDomain.CurrentDomain.BaseDirectory + "Log"; 
  if (!Directory.Exists(Path)) 
  { 
  //若文件目录不存在 则创建 
  Directory.CreateDirectory(Path); 
  } 
  Path += "\\" + DateTime.Now.ToString("yyMMdd") + ".log"; 
  if (!File.Exists(Path)) 
  { 
  File.Create(Path).Close(); 
  } 
  StreamWriter writer = new StreamWriter(Path, true, Encoding.GetEncoding("gb2312")); 
  writer.WriteLine("时间:" + DateTime.Now.ToString()); 
  writer.WriteLine("文件:" + fileName); 
  writer.WriteLine("源:" + source); 
  writer.WriteLine("错误信息:" + erroMsg); 
  writer.WriteLine("-----------------------------------------------------------"); 
  writer.Close(); 
  writer.Dispose(); 
 } 
 } 

结果如下:

Mongodb数据:

查找图片:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Windows或Linux系统中备份和恢复MongoDB数据的教程

    Windows或Linux系统中备份和恢复MongoDB数据的教程

    不得不说MongoDB的备份回复操作对比其他数据库来说真的算得上是简便的,无论是在Windows的命令行中或者是Linux里的脚本执行,这里我们就来看一下Windows或Linux系统中备份和恢复MongoDB数据的教程
    2016-06-06
  • mongodb数据库入门学习笔记之下载、安装、启动、连接操作解析

    mongodb数据库入门学习笔记之下载、安装、启动、连接操作解析

    这篇文章主要介绍了mongodb数据库入门学习笔记之下载、安装、启动、连接操作,结合简单示例形式分析了MongoDB数据库的基本下载、解压、启动服务、连接服务等相关操作技巧与注意事项,需要的朋友可以参考下
    2019-10-10
  • centos8安装MongoDB的详细过程

    centos8安装MongoDB的详细过程

    MongoDB由MongoDB Inc开发,并根据SSPL(服务器端公共许可证)进行分发,是一个开源,跨平台,面向文档的数据库管理系统,本文重点给大家介绍centos8安装MongoDB的详细过程,感兴趣的朋友一起看看吧
    2021-10-10
  • 关于Mongodb 认证鉴权你需要知道的一些事

    关于Mongodb 认证鉴权你需要知道的一些事

    最近因为mongodb被黑了,早先我就疑惑过怎么这东西开启服务就能用了,后来找了各方资料,知道MongoDB默认是没有鉴权的,所以这篇文章主要给大家介绍了关于Mongodb认证鉴权你需要知道的一些事,需要的朋友可以参考下。
    2017-10-10
  • Linux系统下安装MongoDB的详细方法图文教程

    Linux系统下安装MongoDB的详细方法图文教程

    这篇文章主要介绍了Linux系统下安装MongoDB的详细方法图文教程,需要的朋友可以参考下
    2023-06-06
  • MongoDB中查询(find操作符)详细指南

    MongoDB中查询(find操作符)详细指南

    MongoDB是领先的NoSQL数据库之一,以其快速的性能,灵活的模式,可伸缩性和强大的索引功能而闻名,下面这篇文章主要给大家介绍了关于MongoDB中查询(find操作符)的相关资料,需要的朋友可以参考下
    2023-04-04
  • MongoDB CRUD操作中的插入实例教程

    MongoDB CRUD操作中的插入实例教程

    这篇文章主要给大家介绍了关于MongoDB CRUD操作中的插入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • mongodb监控工具mongostat的使用及命令详解

    mongodb监控工具mongostat的使用及命令详解

    mongostat是mongodb自带的状态检测工具,在命令行下使用,会间隔固定时间获取mongodb的当前运行状态,并输出,本文讲述了mongodb监控工具mongostat的使用及命令详解
    2018-03-03
  • MongoDB常用操作命令大全

    MongoDB常用操作命令大全

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。输入help可以看到基本操作命令,只是MongoDB没有创建数据库的命令,但有类似的命令
    2014-03-03
  • Linux服务器快速安装MongoDB5.0版本过程步骤

    Linux服务器快速安装MongoDB5.0版本过程步骤

    这篇文章主要为大家介绍了Linux服务器快速安装MongoDB5.0版本过程步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论