GridFS简介
GridFS是MongoDB中的一个内置功能,能够用于存放大量小文件。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 指定数据库 ,默认是fs,Mongofiles 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; } }
亲测可用!