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; } }
親測可用!