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

原文地址:https://www.cnblogs.com/Yuuuuu/p/10128284.html