參考:http://www.runoob.com/mongodb/mongodb-gridfs.html
1.命令執行
MongoDB GridFS
GridFS 用於存儲和恢復那些超過16M(BSON文件限制)的文件(如:圖片、音頻、視頻等)。
GridFS 也是文件存儲的一種方式,但是它是存儲在MonoDB的集合中。
GridFS 可以更好的存儲大於16M的文件。
GridFS 會將大文件對象分割成多個小的chunk(文件片段),一般為256k/個,每個chunk將作為MongoDB的一個文檔(document)被存儲在chunks集合中。
GridFS 用兩個集合來存儲一個文件:fs.files與fs.chunks。
每個文件的實際內容被存在chunks(二進制數據)中,和文件有關的meta數據(filename,content_type,還有用戶自定義的屬性)將會被存在files集合中。
GridFS 添加文件
現在我們使用 GridFS 的 put 命令來存儲 mp3 文件。 調用 MongoDB 安裝目錄下bin的 mongofiles.exe工具。
打開命令提示符,進入到MongoDB的安裝目錄的bin目錄中,找到mongofiles.exe,並輸入下面的代碼:
1 >mongofiles.exe -d gridfs put song.mp3
gridfs是存儲文件的數據名稱。如果不存在該數據庫,MongoDB會自動創建。Song.mp3 是音頻文件名。
例如:【將a.mp3文件放在MongoDB目錄下】
執行如下命令:
mongofiles.exe -d filesDB put ..\a.mp3
filesDB是數據庫名字 ..\去上一層找 a.mp3是文件名字
然后我們在數據庫中查詢:
-->db.fs.chunks.find()
-->db.fs.files.find()
-->db.fs.chunks.find().count()
這個a.mp3文件工存儲了9個集合
僅查詢某個字段的 值
-->db.fs.chunks.find({"_id" : ObjectId("584f6a44150a0d241401b933")},{"data":1})
2.代碼執行
上傳文件到MongoDB
首先 獲取連接

1 package com.mongo.util; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.mongodb.MongoClient; 7 import com.mongodb.MongoCredential; 8 import com.mongodb.ServerAddress; 9 import com.mongodb.client.MongoDatabase; 10 11 public class MongoConnection { 12 13 /** 14 * 需要驗證用戶名 密碼的 MongoDB的連接方式 com.mongodb.MongoClient.getDatabase("數據庫名") 15 * @return 16 */ 17 public MongoDatabase getConnection() { 18 try { 19 //連接到MongoDB服務 如果是遠程連接可以替換“localhost”為服務器所在IP地址 20 //ServerAddress()兩個參數分別為 服務器地址 和 端口 21 ServerAddress serverAddress = new ServerAddress("localhost",27017); 22 List<ServerAddress> addrs = new ArrayList<ServerAddress>(); 23 addrs.add(serverAddress); 24 25 //MongoCredential.createScramSha1Credential()三個參數分別為 用戶名 數據庫名稱 密碼 26 MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray()); 27 List<MongoCredential> credentials = new ArrayList<MongoCredential>(); 28 credentials.add(credential); 29 30 //通過連接認證獲取MongoDB連接 31 MongoClient mongoClient = new MongoClient(addrs,credentials); 32 33 //連接到數據庫 34 MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName"); 35 System.out.println("連接成功"); 36 return mongoDatabase; 37 } catch (Exception e) { 38 System.err.println( e.getClass().getName() + ": " + e.getMessage() ); 39 } 40 return null; 41 } 42 43 /** 44 * 不需要驗證 用戶名+密碼 的獲取連接的方式 com.mongodb.MongoClient.getDatabase("數據庫名") 45 * @return 46 */ 47 public MongoDatabase getConnectionBasis(){ 48 try { 49 //連接到mongodb服務 50 MongoClient mongoClient = new MongoClient("localhost",27017); 51 MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName"); 52 System.out.println("連接成功"); 53 return mongoDatabase; 54 } catch (Exception e) { 55 System.out.println(e.getClass().getName()+":"+e.getMessage()); 56 } 57 return null; 58 } 59 60 }
接着 就可以創建 傳輸文件所用的通道了
注意 我將操作的文件放在這個位置
讀取項目中某個文件夾下的文件要注意了

1 package com.mongo.test; 2 3 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 9 import org.bson.types.ObjectId; 10 import org.junit.Test; 11 12 import com.mongo.util.MongoConnection; 13 import com.mongodb.client.MongoDatabase; 14 import com.mongodb.client.gridfs.GridFSBucket; 15 import com.mongodb.client.gridfs.GridFSBuckets; 16 17 /** 18 * MongoDB操作文件 19 * @author Administrator 20 * 21 */ 22 public class MongoGridfs { 23 MongoConnection mongoConnection = new MongoConnection(); 24 MongoDatabase database = mongoConnection.getConnectionBasis(); 25 26 @Test 27 public void gridf4File() throws IOException{ 28 //創建 傳輸文件的通道 29 GridFSBucket buckets = GridFSBuckets.create(database); 30 //調用uploadFromStream上傳 31 ObjectId objectId = buckets.uploadFromStream("test.mp3",new FileInputStream(new File(System.getProperty("user.dir")+"/file/test.mp3"))); 32 33 34 FileOutputStream out = new FileOutputStream(new File("d:/aa.mp3")); 35 //調用downloadToStream下載 36 buckets.downloadToStream(objectId, out); 37 out.close(); 38 39 } 40 41 42 43 }
這樣就可以完成對MongoDB的文件傳輸了
還有一點補充的代碼 是基友的代碼作為參考 【很詳細】:

1 package com.mongo.util; 2 3 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.util.ArrayList; 7 import java.util.List; 8 import org.bson.conversions.Bson; 9 import com.mongodb.BasicDBObject; 10 import com.mongodb.MongoClient; 11 import com.mongodb.MongoCredential; 12 import com.mongodb.ServerAddress; 13 import com.mongodb.client.MongoDatabase; 14 import com.mongodb.client.gridfs.GridFSBucket; 15 import com.mongodb.client.gridfs.GridFSBuckets; 16 import com.mongodb.client.gridfs.GridFSFindIterable; 17 import com.mongodb.client.gridfs.model.GridFSDownloadByNameOptions; 18 import com.mongodb.client.gridfs.model.GridFSFile; 19 20 /** 21 * 22 * @author AGEN 23 * 24 */ 25 public class TestMondodb { 26 public static void main(String[] args) { 27 try { 28 //localhost:mongodb服務器的地址, 27017:mongodb服務器的端口 29 ServerAddress serverAddress = new ServerAddress("localhost", 27017); 30 List<ServerAddress> addrs = new ArrayList<ServerAddress>(); 31 addrs.add(serverAddress); 32 //第一個參數report:用戶名,第二個參數report:數據庫名,第三個參數"sa".toCharArray():密碼 33 MongoCredential credential = MongoCredential.createScramSha1Credential("report", "report", "sa".toCharArray()); 34 List<MongoCredential> credentials = new ArrayList<MongoCredential>(); 35 credentials.add(credential); 36 37 //通過連接認證獲取MongoDB連接 38 MongoClient mongoClient = new MongoClient(addrs, credentials); 39 40 //連接到數據庫 41 MongoDatabase mongoDatabase = mongoClient.getDatabase("report"); 42 43 //創建文件存取通道 44 GridFSBucket gsb = GridFSBuckets.create(mongoDatabase); 45 46 //向mongodb里面寫入文件 47 // File file = new File("F:\\500226199001096256.jpg"); 48 // FileInputStream fis = new FileInputStream(file); 49 // ObjectId id = gsb.uploadFromStream("字根.jpg", fis); 50 51 //按Id查找文件,並保存到指定地方 52 //注意,下面ID為fs.files的id, 非fs.chunks的id 53 //如果不行,我就不知道了,你解決后跟我說一下,讓我長長見識!thank you 54 FileOutputStream fos = new FileOutputStream(new File("D:\\aaaa.jpg")); 55 // gsb.downloadToStream(new ObjectId("57178cd65eeb4f1f5c2cbaf1"), fos); 56 57 //對於你那個uuid是36位的,可以這樣構建條件來查詢將下列md5換成你的_id,對應的值換成像的36位uuid即可 58 Bson bson = new BasicDBObject("md5", "4d08209a90345ec9ebb0baf99dd218a1"); 59 GridFSFindIterable gsfi = gsb.find(bson); 60 //因為你的_id是用uuid來表示的,是唯一的,所以應該可以也只能查出一條記錄,在此就直接取第一條,否則應該再篩選 61 GridFSFile gfsf = gsfi.first(); 62 //按文件名來取得此文件,第三個參數直接創建,表示取此文件的最新版本,如果需要取較舊的版本,則new GridFSDownloadByNameOptions().revision(0) 63 //其中0為版本號,表示如下 64 // 0 = the original stored file 65 // 1 = the first revision 66 // 2 = the second revision 67 // etc.. 68 // -2 = the second most recent revision 69 // -1 = the most recent revision 70 gsb.downloadToStreamByName(gfsf.getFilename(), fos, new GridFSDownloadByNameOptions()); 71 System.out.println(gfsf.getFilename() + "---" + gfsf.getObjectId() + "---" + gfsf.getId()); 72 } catch (Exception e) { //57178cd65eeb4f1f5c2cbaf2 73 System.err.println(e.getClass().getName() + ":" + e.getMessage()); 74 } 75 } 76 }