首页 » Web前端 » phpmongodb文件存储技巧_运用MongoDB存储大年夜文件

phpmongodb文件存储技巧_运用MongoDB存储大年夜文件

duote123 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

GridFS是用来办理大文件(>16M)存储问题,由于mongo的BSON格式的document最大支持便是16M

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

phpmongodb文件存储技巧_运用MongoDB存储大年夜文件

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

phpmongodb文件存储技巧_运用MongoDB存储大年夜文件
(图片来自网络侵删)

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

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

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

看下末了用了470个chunk。
470255 = 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存储大文件,实在很大略。
不妨一试。

标签:

相关文章