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

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

(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. cookie 使用方法

    //写cookies setCookie: function(name, value) { let days = 1 let exp = new Date() exp.setTime(exp.getT ...

  2. 使用c#对MongoDB进行查询(1)

    1.BsonDocument对象 在MongoDB.Bson命名空间下存在一个BsonDocument类,它是MongoDB的文档对象,代表着MongoDB中不规则数据一条条实体模型.可以使用Bson ...

  3. python 中的 args,*args,**kwargs的区别

    一.*args的使用方法 *args 用来将参数打包成tuple给函数体调用 例子一:def function(*args):      print(args, type(args))function ...

  4. mysql与emoji和特殊字符

    从微信登陆已经是非常普遍的登陆方式了,在数据库设计时也应该考虑相关性.一般存储open_id.图标.昵称就够了.其中昵称要特殊注意,否则可能就像这样: mysql : 1366 Incorrect s ...

  5. mybatis学习日记-day01

    Mybatis说明: MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的 ...

  6. 关于embed的一些使用兼容

    因公司需求,要做一个扫描语音播报的功能,所以用到一些音频/视频标签 考虑到   <embed>   标签对于ie的兼容性更好一些所以,我在这采用了   <embed>   标签 ...

  7. 笔记:MyBatis XML配置-typeAliases 内建别名表

    别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boole ...

  8. java 日期格式处理

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();Sy ...

  9. iOS CocoaPods一些特别的用法 指定版本、版本介绍、忽略警告

    简介 介绍一些CocoaPods一些特别的用法 CocoaPods github地址 CocoaPods 官方地址 1. 指定第三方库版本 1. 固定版本 target 'MyApp' do use_ ...

  10. Dynamics 365 for CRM: Sitemap站点图的可视化编辑功能

    Dynamics 365 for CRM 提供了Sitemap站点图的可视化编辑功能 在之前的所有版本中,我们只能通过从系统中导出站点图的XML进行编辑后再导入(容易出错),或使用第三方的Sitema ...