mongodb Gridfs操做

mongodb Gridfs操做

GridFS 介紹

GridFS是MongoDB規範用於存儲和檢索大文件,如圖片,音頻文件,視頻文件等。這是一種文件系統用來存儲文件,但數據存儲於MongoDB集合中。GridFS存儲文件比其文檔大小16MB限制的更大能力。html

GridFS的劃分一個文件分紅塊存儲數據每一個塊在一個單獨的文件,每一個最大尺寸255K。mongodb

GridFS默認使用兩個集合 fs.files 和 fs.chunks 存儲該文件的元數據和塊。每組塊標識其惟一的_id ObjectID字段。fs.files切斷做爲父文件。 fs.chunks 文檔 files_id 字段連接塊到其父文件。數據庫

如下是fs.files集合的樣本文件:工具

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

文件指定的文件名,塊大小,上傳日期,和長度。spa

如下是 fs.chunks 文件的樣本文件:視頻

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}

將文件添加到GridFS:

如今,咱們將使用GridFS的put命令存儲MP3文件。 爲此,咱們將使用存在於MongoDB的安裝文件夾下的bin文件夾的mongofiles.exe工具。htm

打開命令提示符,導航到MongoDB的安裝文件夾下的bin文件夾中的mongofiles.exe,並鍵入下面的代碼:對象

>mongofiles.exe -d gridfs put song.mp3

這裏,gridfs上在文件存儲在數據庫的數據庫名稱。 若是數據庫不存在,MongoDB會自動動態建立一個新文檔。 Song.mp3的是上載的文件的名稱。要查看數據庫文件的文件,你可使用查詢找到:blog

>db.fs.files.find()

上面的命令返回如下文檔:圖片

{
   _id: ObjectId('534a811bf8b4aa4d33fdf94d'), 
   filename: "song.mp3", 
   chunkSize: 261120, 
   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
   length: 10401959 
}

咱們也能夠看到在fs.chunks集合涉及使用下面的代碼保存的文件都存在於塊中,使用之前的查詢返回文檔ID:

>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

在個人示例中,該查詢返回40個文檔,是整個MP3文件劃分紅的40塊數據。

 

 

前言

GridFS是一種將大型文件存儲在MongoDB的文件規範:

 

數據庫支持以BSON格式保存二進制對象。 可是MongoDB中BSON對象最大不能超過4MB。

GridFS 規範提供了一種透明的機制,能夠將一個大文件分割成爲多個較小的文檔。

爲實現這點,該規範指定了一個將文件分塊的標準。每一個文件都將在文件集合對象中保存一個元數據對象,一個或多個塊對象可被組合保存在一個塊集合中。

 

上傳文件

  • Shell

        mongofiles put xxx.txt

        經常使用參數以下:

 

        -d 指定數據庫 

        -u –p 指定用戶名,密碼

        -h 指定主機

        -port 指定主機端口

        -r 若是存在同名文件則在put成功後刪除其餘同名文件

 

        經過這樣的命令就能夠把文件上傳到fs集合中。

  • Java

        //獲取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //獲得Gridfs對象

        GridFS fs = new GridFS(db);

        //訪問要上傳的文件

        File file = new File("/Users/luoaz/05testDir/files/test1.txt");

        //執行保持

        GridFSInputFile gfFile = fs.createFile(file);

        gfFile.save();

下載文件

  • Shell

        mongofiles get xxx.txt

        經常使用參數以下:

 

        -d 指定數據庫 

        -u –p 指定用戶名,密碼

        -h 指定主機

        -port 指定主機端口

        -l 下載到本地的文件名,默認和數據庫中的名字一致

 

        經過這樣的命令就能夠把文件從fs集合中下載到本地。

  • Java

        Java 下載的重點是怎麼獲取到文件流,獲取到文件流後就跟普通的保持文件到本地同樣了。

          //獲取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //獲得Gridfs對象

        GridFS fs = new GridFS(db);

        

        //要下載到的文件路徑

        File file = new File("/Users/files/down_test1.txt");

        FileOutputStream os = new FileOutputStream(file);

                        

        //得到文件流

        InputStream is = fs.findOne(new BasicDBObject("filename","test1.txt")).getInputStream();

                        

        //下載

        byte[] bytes = new byte[1024];

        while(is.read(bytes)>0){

                os.write(bytes);

        }

        os.flush();

        os.close();

 

刪除文件

  • Shell

        mongofiles delete xxx.txt

        刪除指定名稱的文件,若是存在同名文件則都刪除

        經常使用參數以下:

 

        -d 指定數據庫 

        -u –p 指定用戶名,密碼

        -h 指定主機

        -port 指定主機端口

  • Java

        //獲取db

        MongoClient mClient = new MongoClient("10.211.55.8");

        db = mClient.getDB("test");

        //獲得Gridfs對象

        GridFS fs = new GridFS(db);

                        

        //刪除指定文件名稱的文件

        fs.remove("test1.txt");

查看文件

  • Shell

        一、list 

                顯示全部文件

                mongofiles list xx.txt

                顯示全部的指定文件名的文件

        二、search

                搜索指定名稱的文件,能夠模糊搜索

                mongofiles list xx.txt

                mongofiles list .txt

  • Java

        這個就跟MongoDB的find用法同樣了

 

 

 

/*//保存文件 
GridFSFile file = myFS.createFile(new File("D:/aa.png")); 
file.save(); */

//輸出文件 
GridFSDBFile file1 =myFS.findOne("aa.png"); 
file1.writeTo(new File("D:/image1.png"));

//刪除文件 
/*GridFSDBFile file =myFS.findOne("image1.jpg"); 
myFS.remove((ObjectId) file2.getId());*/ 

分類: mongodb

標籤: mongodb

相關文章
相關標籤/搜索