最近一直在搞负载均衡一块的东西,遇到了一个问题就是文件相关的。这个问题是这样的,一般情况下,我们文件都是存在服务器的本地路上上,正常情况下,完全没问题,但是当服务需要搭负载均衡时,这种文件存储方式的问题就显现出来了。例如我的文件在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