• 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 MongoFileContext
        {
            // 读取连接字符串 “mongodb://127.0.0.1:27017”
            //private string _conStr = ConfigurationManager.ConnectionStrings["MongoDBConnStr"].ConnectionString;
            private IMongoDatabase _mongoContext;
            // private string _dbName = ConfigurationManager.AppSettings.Get("MongoDBName");
            private MongoFileContext()
            {
    
            }
    
            public MongoFileContext(string strCon, string dbName)
            {
                GetMongoContext(strCon, dbName);
            }
    
            /// <summary>
            /// 获得数据库上下文
            /// </summary>
            /// <param name="strCon">连接字符串人,如:mongodb://DBUser:123456@192.168.103.120:27017/TestDB</param>
            /// <param name="dbName"></param>
            private void GetMongoContext(string strCon, string dbName)
            {
                var client = new MongoClient(strCon);
                if (client != null)
                {
                    //通过数据库名获得上下文 名称可以配置到配置文件里
                    _mongoContext = client.GetDatabase(dbName);
                }
            }
    
            /// <summary>
            /// 上传文件(流)
            /// </summary>
            /// <param name="bucketName">相当于文件夹名</param>
            /// <param name="fileName">文件名</param>
            /// <param name="fs">文件流</param>
            /// <returns></returns>
            public 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 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 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;
            }
    
            /// <summary>
            /// 获得文信息
            /// </summary>
            /// <param name="bucketName"></param>
            /// <param name="fileId"></param>
            /// <returns></returns>
            public GridFSFileInfo<ObjectId> GetFileInfo(string bucketName, string fileId)
            {
                GridFSBucketOptions options = new GridFSBucketOptions();
                options.BucketName = bucketName;
                var bucket = new GridFSBucket(_mongoContext, options);
                var filter = Builders<GridFSFileInfo<ObjectId>>.Filter.Eq(x => x.Id, new ObjectId(fileId));
                var fileInfo = bucket.Find(filter);
                return fileInfo.FirstOrDefault();
            }
        }

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

  • 相关阅读:
    bzoj2888: 资源运输
    [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
    [ POI 2017 ] Podzielno
    [ HAOI 2011 ] Problem A
    [ SDOI 2011 ] 打地鼠
    [ SCOI 2007 ] Perm
    [ POI 2011 ] Dynamite
    [ BZOJ 3038 & 3211 / SPOJ GSS4 ] 上帝造题七分钟2 / 花神游历各国
    [ BZOJ 3445 ] Roadblock
    [ ZJOI 2006 ] Mahjong
  • 原文地址:https://www.cnblogs.com/Yuuuuu/p/10128284.html
Copyright © 2020-2023  润新知