我们经常会遇到这样的场景:上传/下载文件。

有两种思路可以解决这个问题:

(1)将文件存储在服务器的文件系统中;

(2)将文件存储在数据库中。

如果我们选择(2),那么我们可以使用MongoDB GridFS 用于存储大小超过 16MB 的文件(文档,压缩文件,音视频,软件)。

一、MongoDB GridFS 介绍

MongoDB GridFS 是一个分布式文件系统,可用于存储/检索大小超过 16MB 的文件。

内部实现:将文件分割为一个个 chunk (默认大小为 255KB)进行存储。

两个优点:

(1)可以存储大文件(超过 16MB);

(2)可以从文件的中间位置访问文件。

二、代码示例

 public class FileService {

     // 返回DB
private DB getDB() {
// ...
} /* 根据getDB()返回的DB新建一个GridFS实例并返回
* 这个GridFS实例用于上传、下载、删除、查找文件。
*/
private GridFS getGridFS() {
return new GridFS(getDB(), "自己定义的collection名");
} /**
* 保存类型为MultipartFile的文件
*
* @param multipartFile
* @throws IOException
*/
public void saveOne(final MultipartFile multipartFile) throws IOException {
saveOne(multipartFile.getInputStream(), multipartFile.getOriginalFilename()); } /**
* 保存类型为java.io.File的文件
*
* @param file
* @throws IOException
*/
public void saveOne(final File file) throws IOException {
saveOne(new FileInputStream(file), file.getName());
} public void saveOne(final InputStream in, final String fileName) {
GridFSInputFile gridFSInputFile = getGridFS().createFile(in);
gridFSInputFile.setFilename(fileName);
gridFSInputFile.save(); } /**
* 查询所有已上传的文件
*
* @return
*/
public Object queryAllFile() {
List<GridFSDBFile> result = getGridFS().find((DBObject) null);
List<Map<String, Object>> finalResult = new ArrayList<>();
Map<String, Object> map = null;
for (GridFSDBFile file : result) {
map = new HashMap<>();
map.put("id", ((ObjectId) file.getId()).toHexString());
map.put("fileName", file.getFilename());
map.put("length", file.getLength());
finalResult.add(map); }
return finalResult;
} /**
* 查询指定id的文件
*
* @param hexStringId
* 十六进制的id
* @return
*/
public GridFSDBFile queryOne(final String hexStringId) {
GridFSDBFile file = getGridFS().findOne(new ObjectId(hexStringId));
return file; } /**
* 删除给定id的文件
*
* @param hexStringId
*/
public void removeOne(final String hexStringId) {
getGridFS().remove(new ObjectId(hexStringId));
}
}

代码比较简单,就不做过多说明了。

MongoDB GridFS 存储大文件的更多相关文章

  1. MongoDB(八)Mongodb——GridFS存储

    mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoD ...

  2. 在MySQL中存储大文件

    我们的目标:把一首mp3保存到MySQL数据库中! 由于MySQL默认当存入的数据太大时会抛异常,所以应在my.ini中添加如下配置!max_allowed_packet=10485760,这样,可以 ...

  3. MongoDB自定义存储数据库文件位置

    mongodb下载地址:https://www.mongodb.com/download-center#community 本机安装目录如下: 配置步骤如下: 1.新建文件夹data(文件夹内再建一个 ...

  4. mongo 固定集合,大文件存储,简单优化 + 三招解决MongoDB的磁盘IO问题

    1.固定集合 > db.createCollection(, max:});//固定集合 必须 显式创建. 设置capped为true, 集合总大小xxx字节, [集合中json个数max] { ...

  5. mongoDB 大文件存储方案, JS 支持展示

    文件存储 方式分类 传统方式 存储路径 仅存储文件路径, 本质为 字符串 优点: 节省空间 缺点: 不真实存储在数据库, 文件或者数据库发送变动需要修改数据库 存储文件本身 将文件转换成 二进制 存储 ...

  6. 如何安放你的大文件,MongoDB GridFS可以帮助你

    1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...

  7. 实验mongodb使用gridfs存放一个大文件

    1.启动mongoDB 2.使用gridfs存放大文件 3.观察fs.chunks和fs.files的情况 命令 db.fs.chunks.find()查到的是一些二进制文件:

  8. GridFS大文件的添加、获取、查看、删除

    GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频.高清图片等. 利用GridFS可以简化需求. GridFS会直接利用已经建立的 ...

  9. MongoDB GridFS(命令行+php操作)

    一.GridFS是什么 & 为什么需要它 我们知道目前MongoDB的BSON文件最大只能是16M,也就是说单个文档最多只能存储16M的数据,那么如果需要MongoDB存储超过16M的大文件该 ...

随机推荐

  1. Vim修炼秘籍之语法篇

    前言 少年,我看你骨骼精奇,是万中无一的武学奇才,维护世界和平就靠你了,我这有本秘籍<Vim修炼秘籍>,见与你有缘,就十块卖给你了! 如果你是一名 Vimer,那么恭喜你,你的 Vim 技 ...

  2. Python的Argparse模块是什么?(未完)

            近日在阅读代码的过程中遇到了Argparse模块,记得前段时间已经看了,可是过了两周现在又忘了, 看来写代码一定要钻研到底搞清楚其中原委才行,本文主要参考Python3.6系列官方文档 ...

  3. ubuntu系统备份与恢复(也适用于其他linux系统)

    在windows环境下面,有很多的备份恢复软件,系统也自带了备份恢复功能,比较知名的软件比如ghost等,为什么要备份系统,我之前一直都是系统出现问题就全新安装原版的windows,然后各种设置,各种 ...

  4. 温故而知新--hashtable

    哈希在实际使用中主要是当作私有内存,对数据进行插入和查找,哈希数据元素越多,操作的时候消耗的性能就越到,最明显的是当数据元素达到哈希的容量大小时,插入数据冲突概率会变大,并慢慢的退化为数组. 本例子中 ...

  5. null和undefined的异同

    相同点: 都表示值得空缺,二者往往可以互换,用“==”相等运算符判断两个是相等的,要用“===”判断. 在希望值是布尔类型的地方,他们的值都是假值,和“false”类似. 都不包含属性和方法. 使用& ...

  6. 15.C++-操作符重载

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  7. 9.FileWriter 和 BufferWriter

    FileWriter 和 BufferWriter的使用场景 http://www.cnblogs.com/xjyh/p/4529809.html

  8. 常用到的html页面布局和组件: 自己用

    1. 用div当作圆 <div style="border: 1px solid blue;height: 100px; width: 100px; border-radius: 20 ...

  9. X509证书认证流程介绍

    X509证书介绍X.509 是由国际电信联盟(ITU-T)制定的数字证书标准,相信这是人尽皆知的了,目前X.509证书据我所知有三个版本,.net中使用的是x.509-2,X.509-2 版引入了主体 ...

  10. 笔记:Maven Web项目

    生成Web项目模块 生成Web项目模板和生成其他项目的模板一致,差别是指定模板的类型,执行命令如下: mvn archetype:generate -DarchetypeArtifactId=mave ...