mongodb存list_SpringBoot学习笔记(十一:使用MongoDB存储文件 )

@

感谢各位的阅读。博主的这篇文章只是博主的学习笔记,有些问题博主也不太清楚,所以没有解答,抱歉。 源码比较乱,大家将就着看: https://gitee.com/LaughterYoung/dairly-learn

一、MongoDB存储文件

1、MongoDB存储小文件

MongoDB是一个面向文档的数据库,使用BSON(Binary JSON:二进制JSON)格式来存储数据。

BSON格式

BSON支持在一个文档中最多存储16MB的二进制数据。如果存储的是小于16M的文件,可以直接将文件转换为二进制数据,以文档形式存入集合。

Java中文件和二进制转换也比较简单:

文件转换为byte数组

public static byte[] fileToByte(File file) throws IOException{

byte[] bytes = null;

FileInputStream fis = null;

try{

fis = new FileInputStream(file);

bytes = new bytes[(int) file.length()];

fis.read(bytes);

}catch(IOException e){

e.printStackTrace();

throw e;

}finally{

fis.close();

}

return bytes;

}

byte数组转换为文件

public static void bytesToFile(byte[] bFile, String fileDest) {

FileOutputStream fileOuputStream = null;

try {

fileOuputStream = new FileOutputStream(fileDest);

fileOuputStream.write(bFile);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fileOuputStream != null) {

try {

fileOuputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

如果是实现文件下载功能,可以把字节码直接写进流中。

2、MongoDB存储大文件

MongoDB单个文档的存储限制是16M,如果要存储大于16M的文件,就要用到MongoDB GridFS。

GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件。

GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持的驱动均实现了GridFS规范。GridFS制定大文件在数据库中如何处理,通过开发语言驱动来完成、通过API接口来存储检索大文件。

2.1、GridFS存储原理

GridFS使用两个集合(collection)存储文件。一个集合是chunks, 用于存储文件内容的二进制数据;一个集合是files,用于存储文件的元数据。

GridFS会将两个集合放在一个普通的buket中,并且这两个集合使用buket的名字作为前缀。MongoDB的GridFs默认使用fs命名的buket存放两个文件集合。因此存储文件的两个集合分别会命名为集合fs.files ,集合fs.chunks。

当把一个文件存储到GridFS时,如果文件大于chunksize (每个chunk块大小为256KB),会先将文件按照chunk的大小分割成多个chunk块,最终将chunk块的信息存储在fs.chunks集合的多个文档中。然后将文件信息存储在fs.files集合的唯一一份文档中。其中fs.chunks集合中多个文档中的file_id字段对应fs.files集中文档”_id”字段。

读文件时,先根据查询条件在files集合中找到对应的文档,同时得到“_id”字段,再根据“_id”在chunks集合中查询所有“files_id”等于“_id”的文档。最后根据“n”字段顺序读取chunk的“data”字段数据,还原文件。

GridFS存储过程

fs.files 集合存储文件的元数据,以类json格式文档形式存储。每在GridFS存储一个文件,则会在fs.files集合中对应生成一个文档。

fs.files集合中文档的存储内容

fs.chunks 集合存储文件文件内容的二进制数据,以类json格式文档形式存储。每在GridFS存储一个文件,GridFS就会将文件内容按照chunksize大小(chunk容量为256k)分成多个文件块,然后将文件块按照类json格式存在.chunks集合中,每个文件块对应fs.chunk集合中一个文档。一个存储文件会对应一到多个chunk文档。

fs.chunks集合中文档的存储内容

2.2、GridFS使用

2.2.1、使用shell命令

mongoDB提供mingofiles工具,可以使用命令行来操作GridFS。其实有四个主要命令,分别为:

put —存储命令

get —获取命令

list —列表命令

delete —删除命令

操作实例:

存储文件

向数据库中存储文件的格式:mongofiles -d 数据库名字 -l "要上传的文件的完整路径名" put "上传后的文件名"

 在filetest数据库中就会多出2个集合,它们存储了GridFS文件系统的所有文件信息,查询这两个集合就能看到上传的文件的一些信息:

列出文件

查看GridFS文件系统中所有文件:mongofiles -d 数据库名字 list

获取文件

从GridFS文件系统中下载一个文件到本地:mongofiles -d 数据库名字 -l "将文件保存在本地的完整路径名" get "GridFS文件系统中的文件名" ,如果不写-l以及后面的路径参数,则保存到当前位置。

删除文件

删除GridFS文件系统中的某个文件:mongofiles -d 数据库名字 delete " 文件名 "

2.2.2、使用API

MongoDB支持多种编程语言驱动。比如c、java、C#、nodeJs等。因此可以使用这些语言MongoDB驱动API操作,扩展GridFS。

以Java为例:

依赖包和版本:

org.mongodb:3.2.2

mongo-java-driver:3.2.2

公共方法

public MongoDatabase mongoDatabase() throws Exception{

MongoClient mongoClient = new MongoClient(mongoHost, mongoPort);

return mongoClient.getDatabase(dbName);

}

上传文件

@Test

public 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);

}

查找文件

@Test

public 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());

}

下载文件

@Test

public 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("下载完成。");

}

删除文件

@Test

public void delete() throws Exception {

// 获取文件ID

String objectId = "57fbaffcec773716ecc54ef4";

// 创建一个容器,传入一个`MongoDatabase`类实例db

GridFSBucket bucket = GridFSBuckets.create(mongoDatabase());

// 删除

bucket.delete(new ObjectId(objectId));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值