什么是GridFS

GridFS是一种大型文件存储在MongoDB的文件规范,所有官方支持的驱动都实现了GridFS,GridFS是MongoDB中的一个内置功能。可以保存文件。

为什么要使用GridFS

问题一

问题一:用FTP上传文件,把文件地址保存到MySql数据库,与GridFS有什么区别。答:文件系统到了后期会相当的难以管理,同时不利于扩展,此外做分布式文件系统也会显的很不容易,但是GridFS正好相反,基于MongoDB的文件系统,更加便于管理和扩展。

问题二

问题二:普通文件系统对于大文件处理相当麻烦,需要考虑文件系统自身的限制,GridFS提供了什么好方案。答:GridFS 会把大文件对象分割多个小的chunk,一般为256k/块,每块chunk都将会作为很大的内容文件,此外GridFS和MongoDB的分片可以实现分配到多个服务器上,并且没有增加操作的复杂性。

问题三

问题三:可以把二进制文件保存在MongoDB中吗?答:MongoDB默认的文件大小上限为16MB,所以超过了16MB,就应该使用GridFS。

GridFS的两个集合

GridFS使用两个集合保存一个文件,fs.files与fs.chunks。可以使用下面的命令查看

show collections

fs.files集合包含了文件的元数据,使用命令查看

db.fs.files.findOne();

将会返回如下的内容

{    "_id" : ObjectId("57fb553ac7fa9102e0000001"),    "chunkSize" : 261120,    "uploadDate" : ISODate("2016-10-10T08:45:50.051Z"),    "length" : 1.53513e+008,    "md5" : "9222e097e624800fdd9bfb568169ccad",    "filename" : "E:/jdk-7u79-linux-x64.tar.gz"}

fs.chunks集合保存的是256KB尺寸进行分割的文件块,如果有分片的集合,可以分到多台服务器上。

db.fs.chunks.getIndexes();

以下是上传完成文件以后的集合文档

{    "0" : {        "v" : 1,        "key" : {            "_id" : 1        },        "name" : "_id_",        "ns" : "gridfs.fs.chunks"    },    "1" : {        "v" : 1,        "key" : {            "files_id" : 1,            "n" : 1        },        "name" : "files_id_1_n_1",        "ns" : "gridfs.fs.chunks"    }}

GridFS 基本操作

上传文件

使用GridFS的put命令保存文件。输入如下的命令,实现文件的上传

mongofiles.exe -d gridfs put E:\elasticsearch-1.7.0.zip

列出清单

使用命令查看数据库中的文件的文档

db.fs.files.find()

返回的内容为

/* 1 */{    "_id" : ObjectId("57fb553ac7fa9102e0000001"),    "chunkSize" : 261120,    "uploadDate" : ISODate("2016-10-10T08:45:50.051Z"),    "length" : 1.53513e+008,    "md5" : "9222e097e624800fdd9bfb568169ccad",    "filename" : "E:/jdk-7u79-linux-x64.tar.gz"}

/* 2 */{    "_id" : ObjectId("57fb6c49c7fa9135d4000001"),    "chunkSize" : 261120,    "uploadDate" : ISODate("2016-10-10T10:24:09.654Z"),    "length" : 3.17848e+007,    "md5" : "882013a3d205289dddce22c904d3c476",    "filename" : "E:\\elasticsearch-1.7.0.zip"}

查找文件

输入文件的id,可以查看到文件的数据值

db.fs.chunks.find({files_id:ObjectId('57fb553ac7fa9102e0000001')});

以上实例,将会返回50个文档的数据

下载文件

使用get命令下载文件

mongofiles.exe -d gridfs get E:\elasticsearch-1.7.0.zip

Java操作GridFS

添加相关的maven

 org.mongodb    mongo-java-driver    3.2.2

创建链接

public MongoDatabase mongoDatabase() throws Exception{    MongoClient mongoClient = new MongoClient(mongoHost, mongoPort);    return mongoClient.getDatabase(dbName);}

上传文件

@Testpublic void upload() throws Exception {    // 获取文件流    File file = new File("E:/zookeeper-3.4.8.tar.gz");    InputStream in = new FileInputStream(file);    // 创建一个容器,传入一个`MongoDatabase`类实例db    GridFSBucket bucket = GridFSBuckets.create(mongoDatabase());    // 上传    ObjectId fileId = bucket.uploadFromStream(UUID.randomUUID().toString(), in);    System.out.println("上传完成。 文件ID:"+fileId);}

查找文件

@Testpublic void findOne() throws Exception {    // 获取文件ID    String objectId = "57fbaffcec773716ecc54ef4";    // 创建一个容器,传入一个`MongoDatabase`类实例db    GridFSBucket bucket = GridFSBuckets.create(mongoDatabase());    // 获取内容    GridFSFindIterable gridFSFindIterable = bucket.find(Filters.eq("_id", new ObjectId(objectId)));    GridFSFile gridFSFile = gridFSFindIterable.first();    System.out.println("filename: " + gridFSFile.getFilename());}

下载文件

@Testpublic void download() throws Exception {    // 获取文件ID    String objectId = "57fbaffcec773716ecc54ef4";    // 获取文件流    File file = new File("D:/zookeeper-3.4.8.tar.gz");    // 创建一个容器,传入一个`MongoDatabase`类实例db    GridFSBucket bucket = GridFSBuckets.create(mongoDatabase());    // 创建输出流    OutputStream os = new FileOutputStream(file);    // 下载    bucket.downloadToStream(new ObjectId(objectId), os);    System.out.println("下载完成。");}

删除文件

@Testpublic void delete() throws Exception {    // 获取文件ID    String objectId = "57fbaffcec773716ecc54ef4";    // 创建一个容器,传入一个`MongoDatabase`类实例db    GridFSBucket bucket = GridFSBuckets.create(mongoDatabase());    // 删除    bucket.delete(new ObjectId(objectId));    System.out.println("删除完成。");}

总结

使用GridFS可以作为文件的存储之一,可以进行使用。也算是一个解决方案

小明菜市场

查看文件md5_了解 | Mongodb 文件存储之 GridFs相关推荐

  1. MongoDB 文件(MongoDB fs)

    1.不管是存储普通数据也好,还是存储文件也好,我们都要先访问MongoDB数据库 public static MongoDatabase GetDataBase(){//MongoDB 服务器地址va ...

  2. sharepoint文件夹本地同步_干货 | 如何将主机文件自动同步至对象存储

    注:最好利用京东云对象存储来存储一些静态文件,不建议用其直接存储数据库之类的数据文件,而且也会受到速度的影响,当然我们可以利用其存储备份文件. 今天我们来利用s3fs工具将京东云对象存储挂载到京东云云 ...

  3. mysql查看系统运行日志文件_mysql自身运行日志文件详解

    概述 日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志可以帮助我们定位mysqld内部发生的事件,数据库 ...

  4. 服务器怎么查看数据库文件,怎么查看服务器上的数据库文件

    怎么查看服务器上的数据库文件 内容精选 换一换 创建sink流将Flink作业数据通过OBS转储方式输出到数据仓库服务(DWS),即Flink作业数据先输出到OBS,然后再从OBS导入到DWS.如何导 ...

  5. android获取文件上级目录,Android 文件存储

    Android 存储位置及 API 一.内部存储 应用安装后都会在Android 根目录生成 /data/data/packagename,当前应用读取不需要读写权限 注意: 有些开发者可能看到过应用 ...

  6. 如何查看2012服务器登录日志文件,怎样查看2012服务器远程过记录

    怎样查看2012服务器远程过记录 内容精选 换一换 添加二级域名解析的流程与普通的方式相同,仅需要保证主机记录不为空即可.现以公网域名example.com为例,说明为二级子域名123.example ...

  7. 服务器上的文件如何查看,如何查看远程服务器上的文件

    如何查看远程服务器上的文件 内容精选 换一换 分析辅助软件是一款支持部署到多台服务器目标环境上,实现对整个业务集群的数据采集和优化的组件.已成功登录Java性能分析.待安装分析辅助软件的服务器已开启s ...

  8. win7查看隐藏文件_u盘删除文件怎么恢复?

    U盘是存储和转移文件的重要工具,为了使用方便和安全,我们常常会将重要文件存储在U盘中.但是有些时候,因为各种原因,U盘中保存的文件不小心被删除了,而比较头痛的是,U盘文件没有电脑系统中的回收站机制,删 ...

  9. Vbs脚本将本地文件上传到Azure存储账户

    说到Azure相信大家都已经非常熟悉了,所以就不做多介绍了,我们都知道在Azure上有一个存储账户,在存储账户下可以可以创建容器,可以存放数据,近期公司呢为了达到数据的安全性,准备将本地的备份数据给A ...

  10. 看计算机文档有浏览记录吗,怎样查找电脑文件-怎么查看电脑浏览过的文件 – 手机爱问...

    2008-06-27 查看网页"文件"菜单下的"属性",发现网页时间都是浏览时间,不是新闻发布时间.那么这个网页文件储存在电脑的哪个位置上?能改变默认位置吗 网 ...

最新文章

  1. smartupload 上传文件时 把页面编码改成gbk 解决乱码
  2. ORACLE姚翔,- oalib
  3. python切片语法-Python新手学习基础之数据类型——字符串的切片截取
  4. 用Adapter模式重构以前系统的登录权限验证
  5. 南理工计算机技术专业学位,南京理工大学计算机技术(专业学位)考研难吗
  6. Linux 命令之 unrar -- 解压 rar 格式的文件
  7. linux gcc 示例_最好的Linux示例
  8. python prettytable_让python的print变得更好看——prettytable和colorama
  9. Algs4-1.3.45栈的可生成性
  10. tcpserver检测断开qt_QTcpServer或QTcpClient(在服务器端)知道,已连接的客户端现已断开连接...
  11. 基于springboot的多人聊天系统
  12. wps无法使用F4重复上一步操作的解决方法
  13. 证券交易系统搭建的架构方案
  14. 在Ubuntu里配置slim
  15. python ogr创建shp
  16. 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步
  17. iOS开发证书不受信任
  18. WWDC21主题演讲6 月 8 日凌晨1点开幕
  19. 我的世界java版特别卡怎么办_我的世界卡顿延迟怎么办
  20. 人工智能Java SDK:英文翻译为德文

热门文章

  1. ejs 基础语法教程
  2. Flutter进阶第14篇:支付宝支付【上】
  3. Android EditText 常见问题总结
  4. 4_while循环结构和breakcontinue
  5. Sqoop Java API 导入应用案例
  6. H5 表格标签基本使用
  7. 课时2 一些默认样式
  8. 《勿忘初心,不负梦想》
  9. Snabbt.js – 极简的 JavaScript 动画库
  10. 怎么用javascript进行拖拽[zt]