from: http://www.open-open.com/lib/view/open1330171884015.html


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


001importjava.io.FileInputStream;
002importjava.io.IOException;
003importjava.io.InputStream;
004importjava.net.UnknownHostException;
005importjava.security.NoSuchAlgorithmException;
006
007importcom.mongodb.BasicDBObject;
008importcom.mongodb.DB;
009importcom.mongodb.DBCollection;
010importcom.mongodb.DBObject;
011importcom.mongodb.Mongo;
012importcom.mongodb.MongoException;
013importcom.mongodb.gridfs.GridFS;
014importcom.mongodb.gridfs.GridFSDBFile;
015importcom.mongodb.gridfs.GridFSInputFile;
016
017publicclassTest {
018Mongo connection;
019DB db;
020DBCollection collection;
021GridFS myFS;
022
023String mongoDBHost = "127.0.0.1";
024intmongoDBPort = 27017;
025String dbName = "testGridfs";
026String collectionName = "fs";
027
028publicstaticvoidmain(String[] args) throwsMongoException, IOException, NoSuchAlgorithmException {
029Test t = newTest();
030
031String fileName = "F:/CPU.txt";
032String name = "CPU.txt";
033
034//把文件保存到gridfs中,并以文件的md5值为id
035t.save(newFileInputStream(fileName), name);
036
037//据文件名从gridfs中读取到文件
038
039GridFSDBFile gridFSDBFile = t.getByFileName(name);
040if(gridFSDBFile != null){
041System.out.println("filename:"+ gridFSDBFile.getFilename());
042System.out.println("md5:"+ gridFSDBFile.getMD5());
043System.out.println("length:"+ gridFSDBFile.getLength());
044System.out.println("uploadDate:"+ gridFSDBFile.getUploadDate());
045
046System.out.println("--------------------------------------");
047gridFSDBFile.writeTo(System.out);
048}else{
049System.out.println("can not get file by name:"+ name);
050}
051}
052
053publicTest() throwsUnknownHostException, MongoException, NoSuchAlgorithmException {
054_init();
055}
056
057
058publicTest(String mongoDBHost, intmongoDBPort, String dbName,
059String collectionName) throwsUnknownHostException, MongoException, NoSuchAlgorithmException {
060this.mongoDBHost = mongoDBHost;
061this.mongoDBPort = mongoDBPort;
062this.dbName = dbName;
063this.collectionName = collectionName;
064_init();
065}
066
067
068privatevoid_init() throwsUnknownHostException, MongoException, NoSuchAlgorithmException{
069connection = newMongo(mongoDBHost, mongoDBPort);
070db = connection.getDB(dbName);
071collection = db.getCollection(collectionName);
072myFS = newGridFS(db);
073}
074
075/**
076* 用给出的id,保存文件,透明处理已存在的情况
077* id 可以是string,long,int,org.bson.types.ObjectId 类型
078* @param in
079* @param id
080*/
081publicvoidsave(InputStream in, Object id){
082DBObject query  = newBasicDBObject("_id", id);
083GridFSDBFile gridFSDBFile = myFS.findOne(query);
084
085if(gridFSDBFile != null)
086return;
087
088GridFSInputFile gridFSInputFile = myFS.createFile(in);
089gridFSInputFile.save();
090return;
091}
092
093/**
094* 据id返回文件
095* @param id
096* @return
097*/
098publicGridFSDBFile getById(Object id){
099DBObject query  = newBasicDBObject("_id", id);
100GridFSDBFile gridFSDBFile = myFS.findOne(query);
101returngridFSDBFile;
102}
103
104/**
105* 据文件名返回文件,只返回第一个
106* @param fileName
107* @return
108*/
109publicGridFSDBFile getByFileName(String fileName){
110DBObject query  = newBasicDBObject("filename", fileName);
111GridFSDBFile gridFSDBFile = myFS.findOne(query);
112returngridFSDBFile;
113}
114}