Mongo中上传下载图片

           在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" οnclick="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也会存在这样的一个过程,实践中继续验证。



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值