文档章节

MongoDB 的 GridFS 详细分析

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:40
字数 660
阅读 31
收藏 0

GridFS简介

GridFSMongoDB中的一个内置功能,可以用于存放大量小文件。

http://www.mongodb.org/display/DOCS/GridFS

http://www.mongodb.org/display/DOCS/GridFS+Specification

GridFS使用

MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下。

列出所有文件:

mongofiles list

上传一个文件:

mongofiles put xxx.txt

下载一个文件:

mongofiles get xxx.txt

查找文件:

mongofiles search xxx    //会查找所有文件名中包含“xxx”的文件

mongofiles list xxx //会查找所有文件名以“xxx”为前缀的文件

参数说明:

–d 指定数据库 ,默认是fsMongofiles list –d testGridfs

-u –p 指定用户名,密码

-h  指定主机

-port 指定主机端口

-c 指定集合名,默认是fs

-t 指定文件的MIME类型,默认会忽略

使用MongoVUE来查看,管理GridFS

MongoVUE地址:http://www.mongovue.com/

MongoVUE是个免费软件,但超过15天后功能受限。可以通过删除以下注册表项来解除限制:

[HKEY_CURRENT_USER\Software\Classes\CLSID\{B1159E65-821C3-21C5-CE21-34A484D54444}\4FF78130]

把这个项下的值全删掉就可以了。

java驱动上传下载文件:

下载地址:https://github.com/mongodb/mongo-java-driver/downloads

官方的文档貌似不是最新的,不过通过查看api来使用也不困骓。

http://api.mongodb.org/java/2.7.2/

以下代码基于mongo-2.7.3.jar

package mongodbDemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;
import java.security.NoSuchAlgorithmException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
 
public class Test {
    Mongo connection;
    DB db;
    DBCollection collection;
    GridFS myFS;
 
    String mongoDBHost = "127.0.0.1";
    int mongoDBPort = 27017;
    String dbName = "testGridfs";
    String collectionName = "fs";
 
    public static void main(String[] args) throws MongoException, IOException, NoSuchAlgorithmException {
        Test t = new Test();
         
        String fileName = "E:\\July_FM.apk";
        String name = "July_FM.apk";
         File file=new File(fileName);
         System.out.println("file is exit??  "+file.exists());
        //把文件保存到gridfs中,并以文件的md5值为id
        t.save(new FileInputStream(file), name);
         
        //据文件名从gridfs中读取到文件
         
        GridFSDBFile gridFSDBFile = t.getByFileName(name);
        if(gridFSDBFile != null){
            System.out.println("filename:" + gridFSDBFile.getFilename());
            System.out.println("md5:" + gridFSDBFile.getMD5());
            System.out.println("length:" + gridFSDBFile.getLength());
            System.out.println("uploadDate:" + gridFSDBFile.getUploadDate());
             
            System.out.println("--------------------------------------");
            gridFSDBFile.writeTo(System.out);
        }else{
            System.out.println("can not get file by name:" + name);
        }
    }
 
    public Test() throws UnknownHostException, MongoException, NoSuchAlgorithmException {
        _init();
    }
     
 
    public Test(String mongoDBHost, int mongoDBPort, String dbName,
            String collectionName) throws UnknownHostException, MongoException, NoSuchAlgorithmException {
        this.mongoDBHost = mongoDBHost;
        this.mongoDBPort = mongoDBPort;
        this.dbName = dbName;
        this.collectionName = collectionName;
        _init();
    }
     
     
    private void _init() throws UnknownHostException, MongoException, NoSuchAlgorithmException{
        connection = new Mongo(mongoDBHost, mongoDBPort);
        db = connection.getDB(dbName);
        collection = db.getCollection(collectionName);
        myFS = new GridFS(db);
    }
     
    /**
     * 用给出的id,保存文件,透明处理已存在的情况
     * id 可以是string,long,int,org.bson.types.ObjectId 类型
     * @param in
     * @param id
     */
    public void save(InputStream in, Object id){
        DBObject query  = new BasicDBObject("_id", id);
        GridFSDBFile gridFSDBFile = myFS.findOne(query);
         
        if(gridFSDBFile != null)
            return;
         
		myFS.createFile(in, "July_FM.apk");
		GridFSInputFile gridFSInputFile =myFS.createFile(in, "July_FM.apk");
		gridFSInputFile.save();
      
        return;
    }
     
    /**
     * 据id返回文件
     * @param id
     * @return
     */
    public GridFSDBFile getById(Object id){
        DBObject query  = new BasicDBObject("_id", id);
        GridFSDBFile gridFSDBFile = myFS.findOne(query);
        return gridFSDBFile;
    }
     
    /**
     * 据文件名返回文件,只返回第一个
     * @param fileName
     * @return
     */
    public GridFSDBFile getByFileName(String fileName){
        DBObject query  = new BasicDBObject("filename", fileName);
        GridFSDBFile gridFSDBFile = myFS.findOne(query);
        return gridFSDBFile;
    }
}

亲测可用!

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/44230595

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as w......

引鸩怼孑
2015/05/22
0
0
浅尝辄止MongoDB:GridFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82894835 一、为什么使用GridFS GridFS是MongoDB的一个子模块,使用GridFS可以基于M...

wzy0623
2018/09/29
0
0
基于GridFS+NGinx构建分布式文件系统 之实战(三)

基于GridFS构建分布式文件系统 首先看看什么是GridFS: GridFS is a mechanism for storing large binary files in MongoDB. There are several reasons why you might consider using GridF......

一枚Sir
2014/06/20
0
1
mongoDB--GridFS简介

前言 :GridFS从名字来看,就明白是一个文件系统,它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取). 使用场景:如果你的系统有如下情...

索隆
2013/04/15
0
1
mongoDB 之 GridFS简介(一)

前言 :GridFS从名字来看,就明白是一个文件系统,它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取). 使用场景:如果你的系统有如下情...

一枚Sir
2014/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部