1. 程式人生 > >C#使用GrdiFS實現在MongoDB中對檔案操作

C#使用GrdiFS實現在MongoDB中對檔案操作

  最近一直在搞負載均衡一塊的東西,遇到了一個問題就是檔案相關的。這個問題是這樣的,一般情況下,我們檔案都是存在伺服器的本地路上上,正常情況下,完全沒問題,但是當服務需要搭負載均衡時,這種檔案儲存方式的問題就顯現出來了。例如我的檔案在A伺服器上面,當訪問B伺服器時,就會找不到這個檔案,所以我就想辦法解決這個問題,無意中發現MongoDB可以儲存檔案(也不是沒想過用資料庫存,只是覺得資料庫會效率很低),所以決定試一下。


一丶安裝MongoDB

  下載地址:https://www.mongodb.com/download-center

  全部選擇下一步預設即可,也可以更改一下安裝路徑,畢竟用來儲存檔案可能會比較佔地方。

二丶安裝MongoDB管理工具

  下載地址:https://robomongo.org/

  直接點下一步,預設安裝即可。

  MongoDB 預設不需要使用者名稱密碼,預設埠是27017,直接用管理工具連線就可以。

  我手動建立了一個庫,如下:

  

三丶安裝MongoDB.Driver.GridFS

  

  安裝圖中的包,其他的依賴會自動安裝。

四丶檔案工具類MongoFactory

public class MongoFactory
    {
        // 讀取連線字串 “mongodb://127.0.0.1:27017”
        private static
string strCon = ConfigurationManager.ConnectionStrings["MongoDBConnStr"].ConnectionString; private static IMongoDatabase mongoContext; static MongoFactory() { GetMongoContext(); } public static void GetMongoContext() { var client = new
MongoClient(strCon); if (client != null) { //通過資料庫名獲得上下文 名稱可以配置到配置檔案裡 mongoContext = client.GetDatabase("TestDB"); } } /// <summary> /// 上傳檔案(流) /// </summary> /// <param name="bucketName">相當於資料夾名</param> /// <param name="fileName">檔名</param> /// <param name="fs">檔案流</param> /// <returns></returns> public static ObjectId UploadFile(string bucketName, string fileName, Stream fs) { GridFSBucketOptions options = new GridFSBucketOptions(); options.BucketName = bucketName; var bucket = new GridFSBucket(mongoContext, options); var oid = bucket.UploadFromStream(fileName, fs); return oid; } /// <summary> /// 獲得檔案位元組陣列 /// </summary> /// <param name="bucketName"></param> /// <param name="fileId"></param> /// <returns></returns> public static Byte[] GetFileBytes(string bucketName, string fileId) { GridFSBucketOptions options = new GridFSBucketOptions(); options.BucketName = bucketName; var bucket = new GridFSBucket(mongoContext, options); return bucket.DownloadAsBytes(new ObjectId(fileId)); } /// <summary> /// 獲得檔案流 /// </summary> /// <param name="bucketName"></param> /// <param name="fileId"></param> /// <returns></returns> public static Stream GetFileStream(string bucketName, string fileId) { MemoryStream stream = new MemoryStream(); GridFSBucketOptions options = new GridFSBucketOptions(); options.BucketName = bucketName; var bucket = new GridFSBucket(mongoContext, options); bucket.DownloadToStream(new ObjectId(fileId), stream); return stream; } }

   Demo地址:https://github.com/923887863/MongoFileDemo.git