Mongo中上传下载图片

来源:互联网 发布:px4飞控源码 百度云 编辑:程序博客网 时间:2024/05/16 09:11

           在ITOO中教师使用在线编辑的方法出卷,有一个需求是可以针对某一个题配上相应的图片,所以要做一个上传

图片的功能。在ITOO中图片很音频都是直接存储在MongoDB中的,为了实现这个功能自己先做了一个小Demo,实现

上传和下载图片的功能。

          在开始看Demo前先来了解一个Mongo中的GridFS,它是用于存储和恢复那些超过16M的文件可以是图片、音

频、视频。GridFS将文件分成大块,将每个大块存储为单独的文件.GridFS中限制chunk(文件片段)最大为256k。每

chunk将作为MongoDB的一个文档(document)被存储在chunks集合中,每个文件的实际内容被存在chunks(二进制数据)

中。本文章的Demo就是将图片上传到GridFS中的。


          首先需要添加两个和Mongo有关的dll,分别为MongoDB.Bson和MongoDB.Driver。

          配置文件中,在<appSettings>节点下添加,其中key是在连接数据库时使用的,value则是MongoDB所在的服务

器的IP地址。

<span style="font-size:18px;"> </span><span style="font-size:24px;"><add key="mondoDbConnection" value="  .  .  ." /></span>

         首先是页面的代码  

<span style="font-size:24px;"><html>                                                                                            <head>                                                                                           <script>                                                                                         function showImg()                                                                           {                var actions = "DOWNLOAD";                                                                    var ImgInfo = "Penguins.jpg";//这是是已经上传到数据库中的图片的名称                          window.location.href="/UpImg/ProcessRequest?actions=DOWNLOAD&value=" + ImgInfo;            }        </script>                                                                                </head>                                                                                  <body>                                                                                                  <div>          @*找到ProcessRequest,通过获取Action值来执行操作*@                                                 @using (Html.BeginForm("ProcessRequest", "UpImg", new { actions = "UPLOAD" }, FormMe                                                                                            thod.Post, new { enctype = "multipart/form-data" }))          {              <input type="file" name="file" id="file" style="font-size:20px;" />                                 <input type="submit" value="上传" style="font-size:20px" />                     }              <input type="button" value="下载" style="font-size:20px" onclick="showImg()"/>            </div>                                                                                                </body>                                                                                              </html></span><span style="font-size:18px;">  </span>

在Controller中

<span style="font-size:24px;">using MongoDB.Bson;using MongoDB.Driver.GridFS;using MongoDB.Driver public class UpImgController : Controller    {        private static MongoDatabase DB;//用于访问MongoDB数据库和设置        public static string fileTable = "files";        public void ProcessRequest()        {            link();            //从MVC传值,获取            string action = Request.QueryString["actions"];            //通过action值来判断是上传、获取还是下载            switch (action)            {                case "DOWNLOAD": DownFile(); break;//下载文件                case "UPLOAD": Upload(); break;//上传            }        }        #region 链接数据库的设置        /// <summary>        /// 连接数据库设置        /// </summary>        public void link()        {            //使用AppSettings方式和配置文件连接,类似机房收费系统中链接数据库的方法              // string ConnectionString = ConfigurationManager.AppSettings["mondoDbConnection"];            //连接本地的数据库              string ConnectionString = "127.0.0.1";            //连接不成功,提示              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("test");//创建数据库链接,其中的字符串DB3是指数据库的名称,如果没有的话或创建一个            DB = server.GetDatabase("DB3");//创建数据库链接,其中的字符串DB3是指数据库的名称,如果没有的话或创建一个        }         #endregion        #region 上传文件        /// <summary>        /// 上传文件        /// </summary>        public void Upload()        {            try            {                HttpPostedFileBase file = (HttpPostedFileBase)Request.Files["file"];//获得上传的文件                                int nFileLen = file.ContentLength;//获取上传文件的长度                               string nFileName = file.FileName;//获取上传文件的值                //利用GridFSB创建                MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = fileTable };                MongoGridFS fs = new MongoGridFS(DB, fsSetting);                byte[] myData = new Byte[nFileLen];//定义一个为文件长度的定长字节数组                file.InputStream.Read(myData, 0, nFileLen);//将输入流的nFileLen个数据字节读入到myData数组中                //代表创造GridFS文件时使用的选项。                MongoGridFSCreateOptions option = new MongoGridFSCreateOptions();                option.UploadDate = DateTime.Now;                                //创建文件,文件存储数据                using (MongoGridFSStream gfs = fs.Create(file.FileName, option))                {                    gfs.Write(myData, 0, nFileLen);                    gfs.Close();                    Response.Write("<script>alert('上传成功!');window.location.href='/UpImg/Index'</script>");                }            }            catch (Exception e)            {                Response.Write("抱歉上传失败!" + e.Message);            }        }         #endregion        #region 下载文件        /// <summary>          /// 下载文件方法          /// </summary>          public void DownFile()        {            try            {                //获取文件值                string filename = Request.QueryString["value"];                //获取文件类型                Response.ContentType = "application/octet-stream";                //文件名                Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);                //获取图片名                MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = fileTable };                //通过文件名去数据库查值                MongoGridFS fs = new MongoGridFS(DB, fsSetting);                MongoGridFSFileInfo gfInfo = new MongoGridFSFileInfo(fs, filename);                fs.Download(Response.OutputStream, filename);                Response.End();            }            catch (Exception e)            {                Response.Write("抱歉下载失败!" + e.Message);            }        }         #endregion    }}</span>

小结
          初步接触到MongoDB,在做Demo的过程中感觉和刚开始在做机房收费时使用SQLServer的过程是相似,首先是建立连接,然后开始写方法在库中进行增产改查,然后键链接关闭。而后我们对这一系列的操作封装使得使用的方便,而后对数据库在面向对象思想的基础上使用EF进行操作,猜想Mongo也会存在这样的一个过程,实践中继续验证。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网盘绑定的手机号不用了怎么办 百度网盘内存怎么清空不了怎么办 百度网盘下载时本地空间不足怎么办 百度网盘文件放到桌面太大怎么办 百度有钱花借款没有钱还怎么办 安心流量包扣了两百多钱怎么办 邮箱里超大附件的文件过期了怎么办 ps时间轴储存出现参数错误怎么办 苹果手机网易云会员支付失败怎么办 鲸钱包网络异常需重新加载怎么办 微信加载联系人失败点击重试怎么办 网易将军令没有帐号怎么绑定怎么办 网易将军令绑定银行卡锁定了怎么办 网易新闻上的视频没有声音怎么办 把登录窗体的宏删掉了怎么办 电脑死机了怎么办也不能关机了 虎牙直播手游无法和队友开麦怎么办 为成年开无手续麽托出车祸怎么办 支付宝商户未签约或合约过期怎么办 我的手机帐号被锁定了怎么办 点错网页下载收发收费信息怎么办 用邮箱注册的微信忘记密码了怎么办 很久不用的邮箱号忘记密码怎么办 陕西省志愿云忘记密码和邮箱怎么办 国寿易学堂忘记登录密码怎么办 百度云下载显示本地空间不足怎么办 百度云离线内容违规无法下载怎么办 百度云压缩包要压解密码没有怎么办 用2016酷我音乐制作铃音怎么办 邮箱跟手机号一同绑定支付宝怎么办 网易邮箱取消账户关联没反应怎么办 剑三重置版客户端修复不成功怎么办 网易闪电邮的邮件满了怎么办 忘了手机的账号和密码怎么办 手机绑定的扣扣达到十个上限怎么办 邮箱发送邮件到上限无法发送怎么办 路由器重置后不知道账号密码怎么办 发出的邮件别人看了撤回不了怎么办 域名和邮箱是不同的公司怎么办 qq音乐听过的歌单找不到了怎么办 快手开直播前置摄像头太暗怎么办