本次改动主要实现MongoGridFS功能。实现方式主要使用了MongoGridFS和MongoGridFSFileInfo两个类。
设计思路:定义一个IMongoFile接口并继承IEntity,以实现主要的文件操作。该接口的设计主要参考MongoGridFSFileInfo的属性,以尽量满足在保存文件时各种所需。
public interface IMongoFile : IEntity { /// <summary> /// remote file name /// </summary> string RemoteFileName { get; set; } /// <summary> /// local file name /// </summary> string LocalFileName { get; set; } /// <summary> /// data /// </summary> byte[] Data { get; } /// <summary> /// MD5 /// </summary> string MD5 { get; } /// <summary> /// content type /// </summary> string ContentType { get; } /// <summary> /// size /// </summary> int Size { get; } /// <summary> /// alias /// </summary> string[] Aliases { get; } /// <summary> /// metadata /// </summary> BsonDocument Metadata { get; set; } /// <summary> /// upload date /// </summary> DateTime UploadDate { get; set; } /// <summary> /// add alias /// </summary> /// <param name="alias">alias</param> void AddAlias(string alias); /// <summary> /// add aliases /// </summary> /// <param name="aliases">aliases</param> void AddAliases(string[] aliases); /// <summary> /// download file /// </summary> /// <param name="localFileName">abs file full path</param> void Download(string localFileName); /// <summary> /// download file /// </summary> /// <param name="stream">file stream</param> void Download(Stream stream); }
MongoFile是该接口的实现。MongoFile主要有三个带参构造函数
MongoDB.Repository.MongoFile.MongoFile(string, string, string) MongoDB.Repository.MongoFile.MongoFile(System.IO.Stream, string, string) MongoDB.Repository.MongoFile.MongoFile(MongoDB.Driver.GridFS.MongoGridFSFileInfo)
前两个均为上传时使用,用以初始构造,调用IMongoFile.Save()后将文件保存。用例如下:
IMongoFile file = MongoEntity.CreateFile(@"c:pic1.jpg", "pic1.jpg", "jpg"); file.Save();
另在MongoEntity中增加了一些公共方法,用以查询、删除和下载文件。如:
void MongoDB.Repository.MongoEntity.DownloadFile(string, string) void MongoDB.Repository.MongoEntity.DownloadFile(string, System.IO.Stream) void MongoDB.Repository.MongoEntity.RemoveFile(string) void MongoDB.Repository.MongoEntity.RemoveFiles(string) IMongoFile MongoDB.Repository.MongoEntity.LoadFile(string) List<IMongoFile> MongoDB.Repository.MongoEntity.LoadAllFiles(string)
RemoveFile和RemoveFiles的区别在于RemoveFile的参数是id,而RemoveFiles的参数是romoteFileName,因为在MongoDB中,文件名是可以重复的,不能重复的是id。
所以也就有了LoadFile和LoadFiles。
下面提供一个简单的使用案例:
IMongoFile file = MongoEntity.CreateFile(@"c:pic1.jpg", "pic1.jpg", "jpg"); file.Save(); IMongoFile fs = MongoEntity.LoadFile(file.Id); fs.Download(@"c:a.jpg"); var files = MongoEntity.LoadAllFiles("test.xml"); MongoEntity.DownloadFile(file.Id, @"c:copy.jpg"); MongoEntity.RemoveFile(file.Id);
至此,MongoDB.Repository的主要功能已经完成。欢迎大家在使用时提出意见。该框架还会不断地完善,敬请关注。