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