«

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

时间:2024-3-1 22:19     作者:韩俊     分类: Mysql


本文实例为大家分享了针对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数据:

查找图片:

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

标签: mysql mongodb

热门推荐