热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GridFS简介及使用

以下内容摘自MongoDB官方文档:GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。缘起数据库支持以BSON格式保存二进制对象。但是MongoDB中BSON对象最大不能超过4MB。GridFS规范提供了一种透明的机制,可以

以下内容摘自MongoDB官方文档: 

GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持驱动均实现了GridFS

规范。 

缘起 

数据库支持以BSON格式保存二进制对象。  但是MongoDB中BSON对象最大不能超过4MB。  

GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档。这将容许

我们有效的保存大的文件对象,特别对于那些巨大的文件,比如视频。 

实现 

为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一

个元数据对象,一个或多个块对象可被组合保存在一个块集合中。文件如何被分块保存的细

节可以参看GridFS Specification; 大多数情况下,你无需了解此规范中细节,而可将注意

力放在各个语言版本的驱动中有关GridFS API的部分或是如何使用mongofiles工具上。 

GridFS规格 

介绍 

 GridFS是一个大对象存储在MongoDB规范。它通过分割成小块,大小通常在256K的大对象。

每块存储为一个单独的文件块收集在一个块。有关该文件的元数据,包括文件名,内容类型,

以及任何可选的开发所需要的信息,被存储为一个文件 放在一个文件集中。因此,对于任何

给定的文件的存储都使用GridFS,将存在于文件中的一个文件集合和一个或多个chunks的

数据块 。 

如果你只是对使用GridFS感兴趣,只需看文档的存储文件 。如果您想了解GridFS执行,请

继续阅读。 

规范 

存储收藏 

 GridFS使用两个集合来存储数据: 

    * files 包含元数据对象 

    * chunks 包含其他一些解释信息的二进制块  

为了使多个GridFS命名为一个单一的数据库,文件和块的集合有一个前缀命名。默认情况下,

前缀是fs的。,所以任何默认GridFS存储将包括集合命名fs.files和fs.chunks。驱动有

可能要改变这个前缀,所以你可以实例,有另一个GridFS命名空间存储照片收藏的具体位置

为:photos.files和photos.chunks。 

========================================第2页========================================

下面是一个标准的Java接口GridFS例子:  

/* 

 * 使用默认的根集合-必须得到支持 

 */ 

GridFS myFS = new GridFS(myDatabase);              // returns a default GridFS (e.g. 

"fs" root collection) 

myFS.storeFile(new File("/tmp/largething.mpg"));   // saves the file into the "fs" 

GridFS store 

/* 

 * 指定使用的根集合 - 可选 

 */ 

GridFS myCOntracts= new GridFS(myDatabase, "contracts");    // returns a GridFS 

where  "contracts" is root 

myFS.retrieveFile("smithco", new File("/tmp/smithco_20090105.pdf")); //retrieves 

object whose filename is "smithco" 

files 

文件集合中的文档包含以下属性: 

  "_id" : ,        // unique ID for this file 

  "length" : data_number,       // size of the file in bytes 

  "chunkSize" : data_number,    // size of each of the chunks.  Default is 256k 

  "uploadDate" : data_date,     // date when object first stored 

  "md5" : data_string           // result of running the "filemd5" command on this 

file's chunks 

任何其他所需的字段可能会被添加到档案文件,常见的包括以下内容: 

{     

  "filename" : data_string,               // human name for the file 

  "contentType" : data_string,            // valid mime type for the object 

  "aliases" : data_array of data_string,  // optional array of alias strings 

  "metadata" : data_object,               // anything the user wants to store 

chunks 

========================================第3页========================================

  "_id" : ,    // object id of the chunk in the _chunks collection 

  "files_id" : , // _id of the corresponding files collection entry 

  "n" : chunk_number,         // chunks are numbered in order, starting with 0 

  "data" : data_binary,       // the chunk's payload as a BSON binary type 

注释: 

    * _id可任意指定.对于任何MongoDB文件,默认的将是一个BSON对象ID。 

    * 该files_id是一个包含文件的集合项_id属性的外键 

Indexes 

db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true}); 

这样,一个块有效地利用它的files_id和 n值可以被检索。请注意,GridFS实现应该使用

findOne得到chunks,不要放弃打开游标查询所有chunks。因此,为了得到第一个块,我们

可以这样做: 

db.fs.chunks.findOne({files_id: myFileID, n: 0}); 

GridFS 

 GridFS是一个大的文件存储在MongoDB的规范。所有的驱动程序支持实现GridFS规范 。 

理由 

该数据库支持存储本地的BSON对象二进制的数据。然而,在MongoDB BSON对象被限于大小

为4MB。GridFS规范提供了一种透明的机制划分大文件在多个文档。这使我们能够有效地存

储大对象,并在特别是大型文件,如视频,案例,许可证范围操作(例如,只取前N个字节

的文件)。 

========================================第4页========================================

执行 

为了促进这一点,一个标准是指定的文件组块。在一个文件的集合,每个文件有一元数据对

象,以及一个或多个chunk对象在一个chunk集合。这些怎样被存储的详细可以在GridFS

规范找到,但是,你并不真的需要阅读,相反地,只要看一下GridFS API在每个语言的客户

端驱动程序或mongofiles工具。 

语言支持 

大部分驱动包括GridFS实施;以下语言没有列出,请检查驱动程序的API文档。(如果不包括

支持的语言,看到GridFS 规范 -执行一个处理程序通常是很容易的。)  

相关驱动程序文件:Java, Perl, PHP, Python, Ruby 

GridFS Tools 

File Tools 

例如: 

$ ./mongofiles list 

connected to: 127.0.0.1 

$ ./mongofiles put libmongoclient.a 

connected to: 127.0.0.1 

done! 

$ ./mongofiles list 

connected to: 127.0.0.1 

libmongoclient.a 12000964 

$ cd /tmp/ 

$ ~/work/mon/mongofiles get libmongoclient.a 

$ ~/work/mongo/mongofiles get libmongoclient.a 

connected to: 127.0.0.1 

========================================第5页========================================

done write to: libmongoclient.a 

$ md5 libmongoclient.a 

MD5 (libmongoclient.a) = 23a52d361cfa7bad98099c5bad50dc41 

$ md5 ~/work/mongo/libmongoclient.a 

MD5 (/Users/erh/work/mongo/libmongoclient.a) = 23a52d361cfa7bad98099c5bad50dc41 

使用java操作MongoDB,实现文件的写入与读取。 

package com.efuture.dao; 

import java.io.File; 

import java.io.IOException; 

import java.util.Date; 

import java.util.List; 

import com.mongodb.DB; 

import com.mongodb.Mongo; 

import com.mongodb.gridfs.GridFS; 

import com.mongodb.gridfs.GridFSDBFile; 

import com.mongodb.gridfs.GridFSFile; 

public class MongoDBFileTest { 

    static DB test=null; 

    static GridFS gridFS=null; 

    public static void main(String[] args) throws  Exception { 

          long start=System.currentTimeMillis(); 

          Mongo mOngo= new Mongo("127.0.0.1", 27017);   //数据库地址,端口号 

          test = mongo.getDB("test");  // 数据库名称 

          gridFS = new GridFS(test );   

          String fileName="eclipse-jee-galileo-SR2-linux-gtk.tar.gz"; // 读取189 

M 的文件 

          String fileNameO="eclipse.zip";   // 写入文件名称 

          MongoDBFileTest mon= new MongoDBFileTest(); 

          File fileIN = new File ("/home/liuxiaoming/公共的/"+fileName);   

          File fileOUT = new File ("/home/liuxiaoming/公共的/"+fileNameO);   

========================================第6页========================================

          /** 

           * 将文件存入 MongoDB 数据库中 

           */ 

//             mon.saveFile(fileIN, fileName); 

//            long end=System.currentTimeMillis(); 

//            System.out.println (end -start); 

          /** 

           * 从MongoDB中读取数据,并且写入磁盘 

           */ 

          List list=mon.findFilesByName(fileName); 

          GridFSDBFile gridFSDBFile=(GridFSDBFile) list.get(0) ; 

          gridFSDBFile.writeTo(fileOUT); 

          System.out.println (list.size() ); 

    } 

    /** 

     * 写入文件 

     * @param fileName 

     */ 

         public void saveFile(File file,String fileName) {   

             try {   

                 GridFSFile mOngofile=gridFS.createFile(file);   

                 mongofile.put("filename", fileName);   

                 mongofile.put("uploadDate", new Date() );   

mongofile.put("contentType",fileName.substring( fileName.lastIndexOf(".") ));   

                 mongofile.save();   

             } catch (IOException e) {   

                 e.printStackTrace();   

             }   

         }   

         /** 

          * 读取文件 

          * @param fileName 

          */ 

         public List findFilesByName(String fileName) {   

             List list =gridFS.find(fileName);   

             return list;   

         }      


推荐阅读
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文探讨了在多种编程语言中实现Hello World输出的方法,从经典的C语言到现代的JavaScript,每种语言都有其独特的表达方式。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
author-avatar
tbc5052661
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有