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

标签: gridfs c# mongodb 增删改查 .NET
37155人阅读 评论(2) 收藏 举报
分类:

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数据:

查找图片:

查看评论

NoSql-MongoDB GridFS+ASP.NET MVC实现上传,显示

之前一篇文章介绍了如何在dos窗口下对MongoDB进行一些简单的操作,但是不管学习什么,最终还是要应用于自己的项目当中,本篇主要介绍在MVC框架中如何应用于我们的MongoDB。 GridFS介绍:...
  • huo065000
  • huo065000
  • 2015年09月14日 18:07
  • 1819

MongoDB GridFS 数据读取效率 benchmark

GridFS 是 MongoDB 下的一个子模块,利用这一模块,可以实现使用MongoDB存储文件,MongoDB 二进制包的bin目录下的mongofile 命令即可模拟实现该功能。 原文链接:h...
  • joeyon
  • joeyon
  • 2015年05月15日 15:08
  • 545

GridFS详细分析

GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 http://www.mongodb.org/display/DOCS/GridFS http://ww...
  • hengyunabc
  • hengyunabc
  • 2012年02月25日 19:21
  • 30525

定时任务知多少(二)——持久化quartz到Mongodb中

上文中,我们粗劣的介绍定时任务相关的知识。并且,我们初步了解了 Spring+quartz 的初步应用:将quartz放在内存中。 通过上文的分析,我们很容易看清:该种方式实现定时任务,较为简单,实...
  • liu765023051
  • liu765023051
  • 2015年09月30日 23:09
  • 8357

Java定时框架Quartz实例详解与定时任务的Mongodb、Mysql持久化实现(一)Quartz组件

一、Quartz概述 Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据一定的时间间隔来调度作业。我学一样东...
  • zhangliangzi
  • zhangliangzi
  • 2016年08月12日 23:17
  • 1940

Quartz.NET-2.3.3 各种 数据库配置 类别大全

下面是Quartz.NET-2.3.3 原生支持的.数据库类别 MongoDB 需要增加Quartz.NET MongoDB 类的引用. Quartz.NET MongoDB 目前支持的 Quar...
  • phker
  • phker
  • 2015年09月18日 19:29
  • 2479

.NET平台MongoDB下使用JobStore存储Quartz.Net的Job,Trigger数据

创建一个控制台应用程序Program.cs: class Program { #region 变量 private static JobStore jo...
  • WuLex
  • WuLex
  • 2016年07月19日 15:09
  • 2037

Mongodb-使用C#Drivers实现增删改查

1.回顾:上篇学习了Mongodb的基本命令学习 2.这篇将学习使用Mongodb的C# Drivers实现增删改查 3.准备:     3.1 C# Drivers支持情况             ...
  • LABLENET
  • LABLENET
  • 2015年08月03日 16:17
  • 1606

MongoDB- C# 驱动之增删改查

MongoDB-C# 驱动之增删改查MongoDB.Driver是MongoDB为C#提供的一种MongoDB数据库操作驱动,利用MongoDB.Driver 我们可以完成对MongoDB常用的增删改...
  • zhanxueguang
  • zhanxueguang
  • 2015年07月20日 22:32
  • 1674

c#.net连接mongodb入门(一)

.net 连接 mongodb
  • fhl812432059
  • fhl812432059
  • 2016年06月01日 15:43
  • 4878
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 146万+
    积分: 2万+
    排名: 495
    博客专栏
    文章分类
    微信公众号