zoukankan      html  css  js  c++  java
  • mongoGridFS

    GridFS是一种将大型文件存储在MongoDB的文件规范:

    1. 数据库支持以BSON格式保存二进制对象。 但是MongoDB中BSON对象最大不能超过4MB。
    2. GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档。
    3. 为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个块对象可被组合保存在一个块集合中。
    4. 文件如何被分块保存的细节可以参看GridFS Specification。
    mongo自带有一个实现mongofliles,基本操作如下:
    1. 列出所有文件:
    2. mongofiles list
    3. 上传一个文件:
    4. mongofiles put xxx.txt
    5. 下载一个文件:
    6. mongofiles get xxx.txt
    7. 查找文件:
    8. mongofiles search xxx    //会查找所有文件名中包含“xxx”的文件
    9. mongofiles list xxx //会查找所有文件名以“xxx”为前缀的文件
    10. 参数说明:
    11. –d 指定数据库 ,默认是fs,Mongofiles list –d testGridfs
    12. -u –p 指定用户名,密码
    13. -h  指定主机
    14. -port 指定主机端口
    15. -c 指定集合名,默认是fs
    16. -t 指定文件的MIME类型,默认会忽略
    原理:
    GridFS在数据库中,默认使用fs.chunks和fs.files来存储文件。
    1.fs.files集合存放文件的信息;
    2.fs.chunks存放文件数据;
     
    一个fs.files集合中的一条记录内容如下,即一个file的信息如下:
    1. {
    2. "_id" : ObjectId("4f4608844f9b855c6c35e298"),   //唯一id,可以是用户自定义的类型
    3. "filename" : "CPU.txt", //文件名
    4. "length" : 778, //文件长度
    5. "chunkSize" : 262144, //chunk的大小
    6. "uploadDate" : ISODate("2012-02-23T09:36:04.593Z"), //上传时间
    7. "md5" : "e2c789b036cfb3b848ae39a24e795ca6", //文件的md5值
    8. "contentType" : "text/plain" //文件的MIME类型
    9. "meta" : null //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
    10. }
    对应的fs.chunks中的chunk如下:
    1. {
    2. "_id" : ObjectId("4f4608844f9b855c6c35e299"), //chunk的id
    3. "files_id" : ObjectId("4f4608844f9b855c6c35e298"), //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
    4. "n" : 0, //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
    5. "data" : BinData(0,"QGV...") //文件的二进制数据,这里省略了具体内容
    6. }
     
    默认chunk的大小是256K:
    public static final int DEFAULT_CHUNKSIZE = 256 * 1024;
     
    写入:
    如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。
    读取:
    先据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。
     
    自定义Gridfs的hash函数:
    尽管从理论上,无论用什么hash函数,都有可能出现hash值相同,但内容不相同的文件,但是对于GridFS默认使用的md5算法,目前已出现长度和md5值都相同但内容不一样的文件。
    如果想要自已改用其它hash算法,可以从驱动入手。因为GridFS在MongoDB中实际也只是两个普通的集合,所以完全可以自已修改驱动,替换下hash算法即可。
     
     
    注意事项:
    1. GridFS不自动处理md5相同的文件,对于md5相同的文件,如果想在GridFS中只有一个存储,要用户自已处理。Md5值的计算由客户端完成。
    2. 因为GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。
  • 相关阅读:
    nowcoderD Xieldy And His Password
    Codeforces681D Gifts by the List
    nowcoder80D applese的生日
    Codeforces961E Tufurama
    Codeforces957 Mahmoud and Ehab and yet another xor task
    nowcoder82E 无向图中的最短距离
    nowcoder82B 区间的连续段
    Codeforces903E Swapping Characters
    Codeforces614C Peter and Snow Blower
    Codeforces614D Skills
  • 原文地址:https://www.cnblogs.com/zwq194/p/3046474.html
Copyright © 2011-2022 走看看