mongodb 的 GridFS 详细分析(二)
nginx-gridfs模块的安装使用
项目主页:https://github.com/mdirolf/nginx-gridfs
通过nginx-gridfs,可以直接用http来访问GridFS中的文件。
1. 安装
安装各种依赖包:zlib,pcre,openssl
在ubuntu下可能是以下命令:
sudo apt-get install zlib1g-dev //貌似sudo apt-get install zlib-dev 不能安装
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
安装git(略)
用git下载nginx-gridfs的代码:
git clone git://github.com/mdirolf/nginx-gridfs.git
cd nginx-gridfs
git submodule init
git submodule update
下载nginx:
wget http://nginx.org/download/nginx-1.0.12.zip
tar zxvf nginx-1.0.12.zip
cd nginx-1.0.12
./configure --add-module=<nginx-gridfs的路径>
make
sudo make install
如果编译出错,则在configure时加上--with-cc-opt=-Wno-error 参数。
2. 配置nginx
在server的配置中加上以下
location /pics/ {
gridfs pics
field=filename
type=string;
mongo 127.0.0.1:27017;
}
上面的配置表示:
数据库是pics,通过文件名filename来访问文件,filename的类型是string
目前只支持通过id和filename来访问文件。
启动nginx:/usr/local/nginx/sbin/nginx
用MongoVUE把一个图片001.jpg上传到pics数据库中。
打开:http://localhost/pics/001.jpg
如果成功,则可以看到显示图片了。
3. nginx-gridfs的不足
没有实现http的range support,也就是断点续传,分片下载的功能。
GridFS实现原理
GridFS在数据库中,默认使用fs.chunks和fs.files来存储文件。
其中fs.files集合存放文件的信息,fs.chunks存放文件数据。
一个fs.files集合中的一条记录内容如下,即一个file的信息如下:
01
|
{
|
02
|
"_id" : ObjectId( "4f4608844f9b855c6c35e298" ), //唯一id,可以是用户自定义的类型
|
03
|
"filename" : "CPU.txt" , //文件名
|
04
|
"length" : 778, //文件长度
|
05
|
"chunkSize" : 262144, //chunk的大小
|
06
|
"uploadDate" : ISODate( "2012-02-23T09:36:04.593Z" ), //上传时间
|
07
|
"md5" : "e2c789b036cfb3b848ae39a24e795ca6" , //文件的md5值
|
08
|
"contentType" : "text/plain" //文件的MIME类型
|
09
|
"meta" : null //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
|
10
|
}
|
对应的fs.chunks中的chunk如下:
1
|
{
|
2
|
"_id" : ObjectId( "4f4608844f9b855c6c35e299" ), //chunk的id
|
3
|
"files_id" : ObjectId( "4f4608844f9b855c6c35e298" ), //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
|
4
|
"n" : 0, //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
|
5
|
"data" : BinData(0, "QGV..." ) //文件的二进制数据,这里省略了具体内容
|
6
|
}
|
默认chunk的大小是256K。
public static final int DEFAULT_CHUNKSIZE = 256 * 1024;
所以在把文件存入到GridFS过程中,如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。
在读取文件的时候,先据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。
自定义Gridfs的hash函数
尽管从理论上,无论用什么hash函数,都有可能出现hash值相同,但内容不相同的文件,但是对于GridFS默认使用的md5算法,目前已出现长度和md5值都相同但内容不一样的文件。
如果想要自已改用其它hash算法,可以从驱动入手。因为GridFS在MongoDB中实际也只是两个普通的集合,所以完全可以自已修改驱动,替换下hash算法即可。
目前java版的驱动比较简单,可以很容易修改实现。
但是要注意,这样不符合GridFS的规范了。
注意事项
1. GridFS不自动处理md5相同的文件,对于md5相同的文件,如果想在GridFS中只有一个存储,要用户自已处理。Md5值的计算由客户端完成。
2. 因为GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。
转载于:https://blog.51cto.com/memory/1291949
mongodb 的 GridFS 详细分析(二)相关推荐
- ARMv8架构u-boot启动流程详细分析(二)
文章目录 1 u-boot在汇编启动阶段对系统的一些初始化 1.1 启动前为后续流程做的一些平台相关操作 1.2 开启地址无关后的重定位地址操作 1.3 进入_main之前系统寄存器初始化和从核的引导 ...
- 【数字信号处理】序列傅里叶变换 ( 序列傅里叶变换定义详细分析 | 证明单位复指数序列正交完备性 | 序列存在傅里叶变换的性质 | 序列绝对可和 → 序列傅里叶变换一定存在 )
文章目录 一.序列傅里叶变换定义详细分析 二.证明单位复指数序列正交完备性 三.序列存在傅里叶变换的性质 一.序列傅里叶变换定义详细分析 序列傅里叶变换 SFT , 英文全称 " Seque ...
- 一起来用Websocket(二):Websocket协议详细分析
一起来用Websocket(二):Websocket协议详细分析 前言 本节主要翻译一下websocket的协议.其中,socket通信开发,最重要的就是协议了.通信软件(QQ.MSN).杀毒软件(3 ...
- 详细分析本机号码一键登录原理
详细分析本机号码一键登录原理! 很多 APP 的目前都支持「本机号码一键登录」功能.本机号码一键登录是基于运营商独有网关认证能力推出的账号认证产品.用户只需一键授权,即可实现以本机号码注册/登录,相比 ...
- Blueprint代码详细分析-Android10.0编译系统(七)
摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...
01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...
- C语言中的static 详细分析
google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...
- 新手向:从不同的角度来详细分析Redis
最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...
- C语言中static详细分析
google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...
- C语言中的static 详细分析 2014-10-11 15:15 143人阅读 评论(0) 收藏...
转自:http://blog.csdn.net/keyeagle/article/details/6708077 看到这篇文章针对C语言的static关键字解释的比较好,这里转载过来.谢谢原作者分享. ...
最新文章
- java graphics 类_对于 Graphics 类的一点认识(转)
- Dajngo admin使用
- JavaScript内存泄漏知多少?
- element ui table scrollTop 滚动到行头或行尾
- lucene_Lucene组件概述
- 论文浅尝 | Complex Embeddings for Simple Link Prediction
- java nio 客户端_Java网络编程:Netty框架学习(二)---Java NIO,实现简单的服务端客户端消息传输...
- java字符串字典排序_java实现对map的字典序排序操作示例
- 华为交换机开启snmp
- Java排序算法(四):Shell排序
- android 删除开机动画,Android删除开机动画bootanimation.zip
- 软件测试面试之智力题
- Visio 2010工具产品密钥
- dk 7 linux x64.rpm,linux x64 Java/JDK 11下载 jdk-11.0.7_linux-x64_bin.rpm官方镜像版
- 考研高等数学张宇30讲笔记——第一讲 高等数学预备知识
- 光流传感器 定位精度_光流定位原理是什么??【转】
- windows下之定时执行bat脚本
- stm32中常见的通信协议之SPI
- Visual Studio 2008 下载地址 V9各种版本官方下载网址
- Win10哪些服务可以关闭/禁用?
热门文章
- centos7.0 配置mysql_Centos7.0配置MySQL主从服务器
- 凸优化第六章逼近与拟合 6.2最小范数问题
- 括号里面一个上面一个数下面一个数符号怎么打?/ 概率论组合符号怎么打?
- 如何发现隐藏的Webshell后门
- 对应的ctrl_定位神技Ctrl+G,12种常用操作技巧,你都知道吗
- Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!
- Jenkins集群搭建
- Spring对 JDBC 的支持,JdbcTemplate类的使用
- CocoaPods 的安装(第三方开源类库)
- hdu 1596 概率dijstra