MongoDB GridFS 存储大文件
我们经常会遇到这样的场景:上传/下载文件。
有两种思路可以解决这个问题:
(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 存储大文件的更多相关文章
- MongoDB(八)Mongodb——GridFS存储
mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoD ...
- 在MySQL中存储大文件
我们的目标:把一首mp3保存到MySQL数据库中! 由于MySQL默认当存入的数据太大时会抛异常,所以应在my.ini中添加如下配置!max_allowed_packet=10485760,这样,可以 ...
- MongoDB自定义存储数据库文件位置
mongodb下载地址:https://www.mongodb.com/download-center#community 本机安装目录如下: 配置步骤如下: 1.新建文件夹data(文件夹内再建一个 ...
- mongo 固定集合,大文件存储,简单优化 + 三招解决MongoDB的磁盘IO问题
1.固定集合 > db.createCollection(, max:});//固定集合 必须 显式创建. 设置capped为true, 集合总大小xxx字节, [集合中json个数max] { ...
- mongoDB 大文件存储方案, JS 支持展示
文件存储 方式分类 传统方式 存储路径 仅存储文件路径, 本质为 字符串 优点: 节省空间 缺点: 不真实存储在数据库, 文件或者数据库发送变动需要修改数据库 存储文件本身 将文件转换成 二进制 存储 ...
- 如何安放你的大文件,MongoDB GridFS可以帮助你
1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...
- 实验mongodb使用gridfs存放一个大文件
1.启动mongoDB 2.使用gridfs存放大文件 3.观察fs.chunks和fs.files的情况 命令 db.fs.chunks.find()查到的是一些二进制文件:
- GridFS大文件的添加、获取、查看、删除
GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频.高清图片等. 利用GridFS可以简化需求. GridFS会直接利用已经建立的 ...
- MongoDB GridFS(命令行+php操作)
一.GridFS是什么 & 为什么需要它 我们知道目前MongoDB的BSON文件最大只能是16M,也就是说单个文档最多只能存储16M的数据,那么如果需要MongoDB存储超过16M的大文件该 ...
随机推荐
- 用MATLAB结合四种方法搜寻罗马尼亚度假问题
选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...
- 制作centos的启动盘
制作centos的U盘启动盘 author:headsen chen 2017-10-13 10:24:50 个人原创,允许转载,请注明作者,出处,否则依法追究法律责任! 1,下载Ultr ...
- JAVA:一篇文章理清多态
很多人总是喜欢,或者说错误地将JAVA中的多态理解得很复杂,最常见的错误说法就是所谓"方法的多态",他们会给出类似下面的例子来佐证"多态是指方法的多态": // ...
- Linux 新手应该知道的一些求助命令
Linux 真正的强大所在是他的[命令行].每一个 Linux 命令其实就是一个程序,借助这些命令,我们可以办到非常多的事情.遇到困难时应该用什么命令去解决呢?下面兄弟连教育Linux小编将会为大家介 ...
- 部署在eclipse上的Tomcat上的publish和clean的区别
publish:就是把自己的web应用发布到tomcat服务器上没这样才能通过浏览器查看浏览 clean: 就是先清除掉原先编译到tomcat上的程序(多个.class文件),之后再发布. 如:我建了 ...
- javascript - 个人笔记汇总
1. onSubmit = "return function ()"; 2. <input type="text" name="fname&q ...
- C++环境搭建与atom编译器编译C++
Windows下安装 方法一--VS: 使用windows开发神器visio studio.这种方法比较简单,直接下载一个最新的vs安装就行.不单单是C++,C.C#.VB等都可以开发. 方法二--只 ...
- SUSE 安装 iServer、iDesktop启动异常问题
前言: SUSE作为一款经典的linux发行版本,在很多企业用户中都有使用. 本文记录的是在SUSE11 SP3系统中安装iServer.iDesktop出现异常的问题. 环境: 系统:SUSE 11 ...
- c语言程序设计第6周编程作业一(分解质因数)
分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程 ...
- C语言第十一次博客作业---函数嵌套调用
一.实验作业 1.1 PTA题目 题目:递归实现顺序输出整数 1. 本题PTA提交列表 2. 设计思路 printdigits函数 定义整型变量result存放结果 if n是10的倍数 result ...