引言
在前面的博客中给大家介绍了我们如何从MongoDB数据库中读取文件并显示在界面中,从我们的代码中可以看出这个过程是比较简单的,那么下面就给大家介绍如何向MongoDB数据库中提交文件。首先说说之前我的做法:之前在我们的项目中向MongoDB数据库中存入文件是比较麻烦的,我们首先通过file控件将文件上传到本地的某个路径下,然后获的这个文件的全路径后,在存入MongoDB数据库中,然后在删除本地路径下的文件,这样做无疑是多此一举了,非常的麻烦,当然了代码量也是非常多的非常的不可取。那么下面我就给个打家介绍一种比较简单的方法来实现此功能。
前台页面代码
@*上传文件代码,可以实现*@ @using (Html.BeginForm("ProcessRequest", "MongodbHelp", new { actions = "UPLOAD" }, FormMethod.Post, new { enctype = "multipart/form-data" })) { <input type="file" name="file" id="file" /> <input type="submit" value="上传" /> }
界面中有一个file控件和一个按钮组成,这样就可以完成上传特定的文件了。
MongodbHelpeController代码
数据库连接代码
private static MongoDatabase DB; public static string fileTable = "fs"; //Sets up the environment. public void Init() { string ConnectionString = "127.0.0.1"; //ConfigurationManager.AppSettings["mondoDbConnection"]; if (String.IsNullOrEmpty(ConnectionString)) { throw new ArgumentNullException("Connection string not found."); } MongoServerSettings mongoSetting = new MongoServerSettings(); mongoSetting.MaxConnectionPoolSize = 15000;//设定最大连接池 mongoSetting.WaitQueueSize = 500;//设定等待队列数 mongoSetting.Server = new MongoServerAddress(ConnectionString, 27017); int count = MongoServer.MaxServerCount; MongoServer server = MongoServer.Create(mongoSetting);//创建连接数据文件 DB = server.GetDatabase("local");//创建数据库连接 }
方法选择代码:通过传递的参数来决定执行什么功能的代码!!
public void ProcessRequest() { Init();//initialize the mongo string action = Request.QueryString["actions"]; switch (action) { case "LIST": GetFileList(); break; //获取文件列表 case "UPLOAD": Upload(); break; //上传文件 case "DELETE": Delete(); break;//删除文件 case "DOWNLOAD": DownFile(); break; //下载文件 } }
上传文件的核心代码:
//上传文件 public void Upload() { try { HttpPostedFileBase file = (HttpPostedFileBase)Request.Files["file"]; int nFileLen = file.ContentLength; MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = fileTable }; MongoGridFS fs = new MongoGridFS(DB, fsSetting); byte[] myData = new Byte[nFileLen]; file.InputStream.Read(myData, 0, nFileLen); //调用Write、WriteByte、WriteLine函数时需要手动设置上传时间 //通过Metadata 添加附加信息 MongoGridFSCreateOptions option = new MongoGridFSCreateOptions(); option.UploadDate = DateTime.Now; //创建文件,文件并存储数据 using (MongoGridFSStream gfs = fs.Create(file.FileName, option)) { gfs.Write(myData, 0, nFileLen); gfs.Close(); } } catch (Exception e) { Response.Write(0); } Response.Write(1); Response.End(); }
这样我们就完成了文件的上传,细心的读者会发现,我们在页面中写了一个表单和一个submit类型的按钮,这样我们提交的时候会将整个表单内容提交,这样我们就在controller中利用Request.Files来获得我们提交的文件,但是如果我们利用ajax的写法就不行了,代码如下:
function upload() { var files = document.getElementById("file").value; alert(document.getElementById("file").value); $.post( "/MongodbHelp/ProcessRequest?actions=UPLOAD", { "file": files }, "multipart/form_data" ) }
这些写的代码我们在controller中利用Request.Fiels根本无法获得值,并且我们在ajax中获得的files的值,只有一文件的名称,是不能获得文件的全路径的。这是因为现在的浏览器的安全程度非常的高,file控件只有杂IE浏览器中能获得全路径,其他的浏览器都是不行的,这方面的代码和写法需要继续研究,希望在这方面有研究的读者们能给一建议
小结
现在我们在上传之前是不需要在先存储在本地的文件下面了,而是直接上传到MongoDB数据库中,这样才是非常爽的方法,通过之前我们的总结到现在为止我们可以实现对MongoDB的上传和下载了,但是这仅仅是个入门的学习,在接下来的时间里会继续研究它。希望这几篇博客能给读者们带来帮助!!!