关闭

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

标签: gridfsc#mongodb增删改查.NET
36713人阅读 评论(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数据:

查找图片:

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1065136次
    • 积分:15789
    • 等级:
    • 排名:第717名
    • 原创:313篇
    • 转载:762篇
    • 译文:107篇
    • 评论:274条
    博客专栏
    文章分类
    打赏
    如果你觉得我的文章对您有用,请随意打赏。 微信 支付宝