|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln
因为MongoDB的文档布局为BJSON格局(BJSON全称:BinaryJSON),而BJSON格局自己就撑持保留二进制格局的数据,因而能够把文件的二进制格局的数据间接保留到MongoDB的文档布局中。可是因为一个BJSON的最年夜长度不克不及凌驾4M,以是限定了单个文档中能存进的最年夜文件不克不及凌驾4M。为了供应对年夜容量文件存取的撑持,samus驱动供应了“GridFS”体例来撑持,“GridFS”体例文件操纵必要引进新的程序集“MongoDB.GridFS.dll”。上面我们分离用两种体例来完成。
1、在文档工具中存取文件
当文件巨细较小的时分,间接存进文档工具完成起来更简便。好比大批图片文件的存取等,一样平常图片文件都不会凌驾4M。我们先完成一个上传图片存进数据库,再掏出来写回页面的例子:
1.把图片存到BJSON中
.代码以下:
///<summary>
///把图片存到BJSON中
///</summary>
publicvoidSaveImgBJSON(byte[]byteImg)
{
Documentdoc=newDocument();
doc["ID"]=1;
doc["Img"]=byteImg;
mongoCollection.Save(doc);
}
2.猎取BJSON体例存储的图片字节数据
.代码以下:
///<summary>
///猎取BJSON体例存储的图片字节数据
///</summary>
publicbyte[]GetImgBJSON()
{
Documentdoc=mongoCollection.FindOne(newDocument{{"ID",1}});
returndoc["Img"]asBinary;
}
下面两段代码是在对MongoDB相干操纵举行BLL封装类中增加的两个办法,封装体例检察上节内容。上面看看在webform中怎样挪用:
在界面拖出一个FileUpload控件和一个Button控件,页面cs类加以下办法:
.代码以下:
protectedvoidButton1_Click(objectsender,EventArgse)
{
ImgBLLimgBll=newImgBLL();
imgBll.DeleteAll();
imgBll.SaveImgBJSON(FileUpload1.FileBytes);
Response.BinaryWrite(imgBll.GetImgBJSON());
}
2、用GridFS体例存取文件
在完成GridFS体例前我先讲讲它的道理,为何能够存年夜文件。驱动起首会在以后数据库创立两个汇合:"fs.files"和"fs.chunks"汇合,前者纪录了文件名,文件创立工夫,文件范例等基础信息;后者分块存储了文件的二进制数据(并撑持加密这些二进制数据)。分块的意义是把文件依照指定巨细支解,然后存进多个文档中。"fs.files"怎样晓得它对应的文件二进制数据在哪些块呢?那是由于在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"另有一个键(int型)"n",它标明这些块的前后按次。这两个汇合名中的"fs"也是能够经由过程参数自界说的。
假如你只是想晓得怎样用,能够疏忽下面这段话,上面将用法:
1.GridFS体例的文件新建,读取,删除
.代码以下:
privatestringGridFsSave(byte[]byteFile)
{
stringfilename=Guid.NewGuid().ToString();
//这里GridFile机关函数有个重载,bucket参数就是用来交换谁人创立汇合名中默许的"fs"的。
GridFilegridFile=newGridFile(mongoDatabase);
using(GridFileStreamgridFileStream=gridFile.Create(filename))
{
gridFileStream.Write(byteFile,0,byteFile.Length);
}
returnfilename;
}
privatebyte[]GridFsRead(stringfilename)
{
GridFilegridFile=newGridFile(mongoDatabase);
GridFileStreamgridFileStream=gridFile.OpenRead(filename);
byte[]bytes=newbyte[gridFileStream.Length];
gridFileStream.Read(bytes,0,bytes.Length);
returnbytes;
}
privatevoidGridFsDelete(stringfilename)
{
GridFilegridFile=newGridFile(mongoDatabase);
gridFile.Delete(newDocument("filename",filename));
}
2.再次封装GridFS操纵,新文档只存储文件称号,相称于只是一个键,新文档还能够有除“文件名”以外其他的键。
.代码以下:
///<summary>
///把图片存到GridFS中
///</summary>
publicvoidSaveImgGridFS(byte[]byteImg)
{
stringfilename=GridFsSave(byteImg);
Documentdoc=newDocument();
doc["ID"]=1;
doc["filename"]=filename;
mongoCollection.Save(doc);
}
///<summary>
///猎取GridFS体例存储的图片
///</summary>
publicbyte[]GetImgGridFS()
{
Documentdoc=mongoCollection.FindOne(newDocument{{"ID",1}});
stringfilename=doc["filename"].ToString();
returnGridFsRead(filename);
}
3、小结
文件存取应当不是很难,值得注重的中央是:用第一种体例从文档中读出二进制数据时,必定要将范例转换为“Binary”范例;另有体系自带的键“_id”,它也不是string范例,是“Oid”范例的。
李盼(Lipan)
出处:[Lipan](http://www.ckuyun.com/lipan/)
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。 |
|