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的大文件该 ...
随机推荐
- Ubuntu开启远程连接
Ubuntu开启远程连接 author:headsen chen 2017-10-13 09:47:38 个人原创,严禁转载,违者追究法律责任: apt-get update apt-get ...
- Cesium polygon中的height和extrudedHeight的区别
1.height参数: 多边形和椭球表面之间的距离(以米为单位). 2.extrudedHeight参数: 多边形的挤压面与椭球面之间的距离(以米为单位).
- 读取pdf内容分页和全部
//读取pdf 全部内容public static String topdffile(String pdffile){ StringBuffer result = new StringBuffer() ...
- 仿vue实现简易版mvvm双向绑定
项目地址:https://github.com/pangyongsheng/mvvm 1. 指令 vm-bind 单选数据绑定- 将数据显示到标签视图 vm-model : 双向数据绑定 vm-sho ...
- MySQL数据库学习四 存储引擎和数据类型
4.1存储引擎 1. 查看MySQL DBMS所支持的存储引擎 SHOW ENGINES;
- Spring Framework 简介
Spring Framework 依赖注入.事务管理.Web应用程序.数据访问.消息传递.测试和更多的核心支持. Tips: Spring 官网:https://spring.io/ spring f ...
- c语言程序设计第3周编程作业(数字特征)
题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相 ...
- beta冲刺2-咸鱼
q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...
- 团队第1次作业:Our Team TAH
Team named TAH 不管一个人多么有才能,但是集体常常比他更聪明和更有力. --奥斯特洛夫斯基 *introduce team and teamate 先说说TAH的含义,是 ...
- 开启Linux的share
1.挂载Install Vmare Tool 2.解压VMwareTools.tar.gz 3.安装share目录 4.shared Folders Enabled 添加共享的目录. 在自己的Unb ...