MongoDB 的 GridFS 詳細分析

GridFS簡介

GridFSMongoDB中的一個內置功能,能夠用於存放大量小文件。vue

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

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

GridFS使用

MongoDB提供了一個命令行工具mongofiles能夠來處理GridFS,在bin目錄下。github

列出全部文件:mongodb

mongofiles list數據庫

上傳一個文件:api

mongofiles put xxx.txt工具

下載一個文件:this

mongofiles get xxx.txturl

查找文件:

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

親測可用!
相關文章
相關標籤/搜索