MongodDB用GridFS方式存取文件
在实现GridFS方式前我先讲讲它的原理,为什么可以存大文件。驱动首先会在当前数据库创建两个集合:"fs.files"和"fs.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。分块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么知道它对应的文件二进制数据在哪些块呢?那是因为在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int型)"n",它表明这些块的先后顺序。这两个集合名中的"fs"也是可以通过参数自定义的。
(我想起了Sql Server的FileStream)
如果你只是想知道怎么用,可以忽略上面这段话,下面将用法:
这里引用了两个第三方dll,可以到https://github.com/samus/mongodb-csharp下载,编译后得到。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.IO; using MongoDB;
using MongoDB.GridFS; namespace mongotest
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
Init();
}
private void btnGridFSSave_Click(object sender, EventArgs e)
{
byte[] byteImg = File.ReadAllBytes(@"c:\temp\yl.jpg");
filename = GridFsSave(byteImg);
MessageBox.Show(filename);
}
private void btnGridFSShow_Click(object sender, EventArgs e)
{
byte[] buff = GridFsRead(filename);
MemoryStream MS = new MemoryStream(buff);
pictureBox1.Image = Image.FromStream(MS);
}
private Mongo mongo;
private IMongoDatabase test;
string filename;
void Init()
{
var connstr = @"Server=localhost:27017";
mongo = new Mongo(connstr);
mongo.Connect();
test = mongo["test"];
}
private string GridFsSave(byte[] byteFile)
{
string filename = Guid.NewGuid().ToString(); //这里GridFile构造函数有个重载,bucket参数就是用来替换那个创建集合名中默认的"fs"的。
GridFile gridFile = new GridFile(test);
using (GridFileStream gridFileStream = gridFile.Create(filename))
{
gridFileStream.Write(byteFile, , byteFile.Length);
}
return filename;
}
private byte[] GridFsRead(string filename)
{
GridFile gridFile = new GridFile(test);
GridFileStream gridFileStream = gridFile.OpenRead(filename);
byte[] bytes = new byte[gridFileStream.Length];
gridFileStream.Read(bytes, , bytes.Length);
return bytes;
}
}
}
存储在数据库中如图:
参考文章:
http://www.cnblogs.com/lipan/archive/2011/03/21/1989409.html
MongodDB用GridFS方式存取文件的更多相关文章
- 使用GridFsTemplate在Mongo中存取文件
Maven依赖(还有一些springboot需要的) <parent> <groupId>org.springframework.boot</groupId> ...
- 使用GridFsTemplate在mongodb中存取文件
spring-data-mongodb之gridfs mongodb除了能够存储大量的数据外,还内置了一个非常好用的文件系统.基于mongodb集群的优势,GridFS当然也是分布式的,而且备份也 ...
- 《用格式化(fprintf和fscanf函数)的方式读写文件》
//用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...
- SQL Server中数据库文件的存放方式,文件和文件组
原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 ...
- 呵呵哒,LNMP下通过fread方式下载文件时,中文名称文件找不到文件
哎,整整折腾一个下午. 本来好好的,thinkphp 自动的uniq方式保存的文件名,非要使用原文件名,真心蛋疼~~ 然后就只好写个脚本 把原来的所有文件都重新命名一下 - - 然后把数据库对应字段也 ...
- Java多种方式读文件,追加文件内容,等对文件的各种操作
一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 import java.io.BufferedReader; import jav ...
- ajax方式下载文件
在web项目中需要下载文件,由于传递的参数比较多(通过参数在服务器端动态下载指定文件),所以希望使用post方式传递参数.通常,在web前端需要下载文件,都是通过指定<a>标签的href属 ...
- C/C++中二进制与文本方式打开文件的区别
二进制与文本文件主要有两个大的区别: 1.换行符的区别: Windows平台下 对于Windows文本文件,它们使用回车和换行来表示换行符:如果以“文本”方式打开文件,当读取文件的时候,系统会将所有 ...
- Python3编写网络爬虫08-数据存储方式一-文件存储
数据存储 用解析器解析出数据之后,就是存储数据了.保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如TXT JSON CSV等.另外还可以保存到数据库中,如关系型数据库MySQL 非关系型数 ...
随机推荐
- Python3.6 import源文件与编译文件的关系
小结: 在Python3.6中 源文件存在时,import会比较源文件与__pycache__里相应文件的时间戳,来决定是否重新生成缓存编译文件 源文件不存在时,import会导入相应的.pyc文件 ...
- 使用Micrisoft.net设计方案 前言
前言 主要阐述23种设计模式在Microsoft.Net中的使用,以及使用设计模式创建后的对象如何使用.同是向我们传达3个理念,分别是: 1. 使用设计模式可以让程序更加灵活 2. 结构越复杂,意 ...
- C#中DataSet中的relation
//关系定义的方法是 DataRelation 变量名 = “DataSet对象”.Relations.Add("关系名",DataSet对象.主表.列名 , DataSet对象. ...
- 常用JQUERY插件大全
jQuery内容滚动插件-BoxSlider jQuery artDialog对话框插件 移动端日期选择组件 图像延迟加载库Echo.js 轮播图FlexSlider插件 Slick.js幻灯片使用方 ...
- 移动端布局 rem,和px
1.rem布局,根据屏幕来计算rem,也就是意义上的适应屏幕,但是一些字体大小转换和计算有些复杂. // rem 布局重定义 (function(){ $('html').css('font-size ...
- 2 Selenium3.0+Python3.6环境搭建
[说明] 再次搭建一次环境,是因为遇到怎么都打不开IE的问题了,环境信息为:Selenium3.0+Python3.6+win7+ie10 [搭建步骤] 1.下载Python3.6,并点击安装和配置环 ...
- 【技术累积】【点】【java】【5】Random和shuffle()
闲聊 妈耶,又这么久没写了..不过最近写其他文章有点多啊... 今天用到Random这个类,竟然还要去查了下... 基本概念 Random类,背后是伪随机数(数学上的东西): 不是很理解,但是基本上而 ...
- 巧用Ajax的beforeSend提高用户体验
jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作. $.ajax({ beforeSend:function(){ ...
- cordova 打包工具
一.环境安装 1.安装NodeJs https://nodejs.org 直接去官网下载并按默认路径安装就可以了. 安装完成后在命令行: (测试成功!) $ npm 2.安装Cordova 命令行 ...
- SaltStact自动化运维工具03
存储位置 类型 采集方式 场景Grains minion 静态 minion启动时,可以刷新 1.获取信息 2.匹配pil ...