【MongoDB】6.關於MongoDB存儲文件的 命令執行+代碼執行


參考: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 }
View Code

接着 就可以創建 傳輸文件所用的通道了

注意 我將操作的文件放在這個位置

讀取項目中某個文件夾下的文件要注意了

 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 }
View Code

這樣就可以完成對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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM