您的位置 首页 java

使用MongoDB存储大文件

GridFS是用来解决大文件(>16M)存储问题,因为mongo的BSON格式的document最大支持就是16M

使用GridFS,在存储文件之后,你会看到两张表:fs.files和fs.chunks

为了突破单个文档的存储限制,GridFS的做法是将文件切分成一个个的chunk存储。fs.files只存储文件的基本信息

真正的文件数据存在fs.chunks中

GridFS默认将文件切分为每个255K大小的chunk。

比如我上传了一个119M的压缩文件。

看下最后用了470个chunk。470*255 = 119850K

看一下fs.files的数据结构

{
 "_id" : ObjectId("5c8f0d788279cf2a7ca422bb"),
 "filename" : "test.rar", :文件名
 "aliases" : null, :别名,非必须
 "chunkSize" : NumberLong(261120),:表示每个chunk的大小。261120就是255K
 "uploadDate" : ISODate("2019-03-18T03:16:08.082Z"),:上传时间
 "length" : NumberLong(122144297),:上传的文件大小,单位是 byte 
 " contentType " : "rar",:文件类型
 "md5" : "3d68d5a17cec41ccbf7dd43a0bfa1804":md5校验
}
 

看一下fs.chunks存的数据结构

{
 "_id" : <ObjectId>,
 "files_id" : <ObjectId>,:关联fs.files表的id
 "n" : <num>,:表示这是第几个chunk
 "data" : < binary >:存的二进制数据
}
 

java代码(核心代码):

上传文件:

// 创建一个GridFS,需要创一个mongo的DB对象进来
GridFS gridFS = new GridFS(appDB);
//  request 是我自己构造的对象,接受页面上传的文件字节
// createFile还有另一个 重载 方法,接受一个File对象,可以省去下面设置Filename和contentType的操作
GridFSInputFile mongofile = gridFS.createFile(request.getBytes());
 String fileName = request.getFileName();
 if (StringUtils.isNotBlank(fileName)) {
 mongofile.setFilename(fileName);
 String contentType = fileName.substring(fileName.lastIndexOf(".") + 1);
 mongofile.setContentType(contentType);
 }
 mongofile.save();
 

另外,也可以通过mongofile.setChunkSize(10 * 1024 * 1024);设置chunksize的大小为10M

下载文件:

 // 有很多重载的find方法,具体看下GridFSDBFile就知道了
 GridFSDBFile gFile = gridFS.findOne(new ObjectId(request.getFileId()));
 if(null != gFile){
 ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
 gFile.writeTo(byteStream);
 result.setFileBytes(byteStream.toByteArray());
 result.setFileName(gFile.getFilename());
 result.setFileContent(gFile.getContentType());
 }
 

删除文件:

 // 也有几个重载方法,
 gridFS.remove(new ObjectId(request.getFileId()));
 

总结:

使用Mongo存储大文件,其实很简单。不妨一试。

文章来源:智云一二三科技

文章标题:使用MongoDB存储大文件

文章地址:https://www.zhihuclub.com/188983.shtml

关于作者: 智云科技

热门文章

网站地图