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

查找图片:

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

以上是 MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查 的全部内容, 来源链接: utcz.com/a/253605.html

回到顶部