MongoDB 的 GridFS 详细分析

2015/04/29 00:40
阅读数 55

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;
    }
}

亲测可用!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部