1. 程式人生 > >MongodbGFS儲存大檔案(java版)

MongodbGFS儲存大檔案(java版)

Mongodb 是一個開源的no-sql分散式資料庫,Mongodb也為我們提供了基於檔案的GFS分散式儲存系統。因此利用Mongodb我們完全可以實現一個分散式的檔案儲存以及管理。

下面的內容主要為大家介紹,如何利用java,將大檔案存入Mongodb資料庫中。我們這裡所說的大檔案,是指大小在16M以上的檔案,這也符合MongodbGFS的說明。

首先我們建立一個java工程,這裡我們使用gradle初始化一個java工程,工程結構如下圖。


當然這裡你也可以使用maven來構建一個java工程,對我們後續工作並不會有影響。

接下來我們去mongodb的官網下載其基於java的驅動包。

Mongodbjava驅動程式


這裡我們只需要將這一行,複製到我們工程的build.gradle 檔案。


然後重新整理gradle,我們可以看到jar包已經新增到我們的程式裡。


接下來我們編寫呼叫的示例,我們新建一個類叫做MongdbGFS.java。然後獲取一個Mongodb的連線,程式碼如下:

  1. package mongodbGfs;  
  2. import com.mongodb.MongoClient;  
  3. import com.mongodb.client.MongoDatabase;  
  4. /** 
  5.  *  
  6.  * @author zhaotong 
  7.  * 
  8.  */
  9. publicclass MongodbGFS {  
  10.     private MongoClient mongoClient;  
  11.     //我們進行操作的資料庫
  12.     private MongoDatabase useDatabase;  
  13.     //初始化
  14.     {  
  15.         mongoClient=new MongoClient("localhost",27017);  
  16.         useDatabase=mongoClient.getDatabase("zhaotong");  
  17.     }  
  18. }  

接下來,我們先不著急寫下面的程式碼,我們先找到一個檔案放到我們工程裡面,為了我們之後的測試。我在src下面新建了一個資料夾file,裡面存放了一個大約21M的pdf檔案。


接下里我們開始進行mongodbGFS檔案的儲存。

首先我們講一下mongodbGFS儲存的一個原理。這裡我們引用mongodb官方文件裡的一句話(文件地址):

GridFS is a specification for storing and retrieving files that exceed the BSON document size limit of 16MB. Instead of storing a file in a single document, GridFS divides a file into parts, or chunks, and stores each of those chunks as a separate document.

When you query a GridFS store for a file, the Java driver will reassemble the chunks as needed.

從上面這段話可以簡單的瞭解到,mongodb是將檔案進行分塊,儲存,當查詢時,mongodb會幫你把你所需要的塊進行組合然後展示給你,因此結合mongodb分散式的特性,我們可以輕易的構建一個分散式的檔案儲存。

在利用java驅動儲存時,當我們獲得需要儲存的資料庫連線之後,我們需要先建立一個bucket,官方的說明如下:

Create a GridFS Bucket

GridFS stores files in two collections: a chunks collection stores the file chunks, and a files collection stores file metadata. The two collections are in a common bucket and the collection names are prefixed with the bucket name.

通過上面的這段話,我們可以知道,mongodb是將檔案分為兩部分儲存,一個是chunks,另一個是files。並且在collection 的名字將會有你bucket的字首。mongodb支援自定義的bucket的名字,當然也有預設,預設是files。
  1. @author zhaotong  
  2.  *  
  3.  */  
  4. publicclass MongodbGFS {  
  5.     private MongoClient mongoClient;  
  6.     //我們進行操作的資料庫
  7.     private MongoDatabase useDatabase;  
  8.     //bucket
  9.     private GridFSBucket gridFSBucket;  
  10.     //初始化
  11.     {  
  12.         mongoClient=new MongoClient("localhost",27017);  
  13.         useDatabase=mongoClient.getDatabase("zhaotong");  
  14.         // 自定義bucket name
  15.         gridFSBucket= GridFSBuckets.create(useDatabase,"zt_files");  
  16.         // 使用預設的名字
  17.         //gridFSBucket=GridFSBuckets.create(useDatabase);
  18.     }  
  19. }  

接下來就是對應的具體操作,程式碼如下:
  1. package mongodbGfs;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.nio.file.Files;  
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11. import org.bson.Document;  
  12. import org.bson.types.ObjectId;  
  13. import com.mongodb.Block;  
  14. import com.mongodb.MongoClient;  
  15. import com.mongodb.client.MongoDatabase;  
  16. import com.mongodb.client.gridfs.GridFSBucket;  
  17. import com.mongodb.client.gridfs.GridFSBuckets;  
  18. import com.mongodb.client.gridfs.GridFSUploadStream;  
  19. import com.mongodb.client.gridfs.model.GridFSFile;  
  20. import com.mongodb.client.gridfs.model.GridFSUploadOptions;  
  21. /** 
  22.  *  
  23.  * @author zhaotong 
  24.  * 
  25.  */
  26. publicclass MongodbGFS {  
  27.     private MongoClient mongoClient;  
  28.     // 我們進行操作的資料庫
  29.     private MongoDatabase useDatabase;  
  30.     // bucket
  31.     private GridFSBucket gridFSBucket;  
  32.     // 初始化
  33.     {  
  34.         mongoClient = new MongoClient("localhost"27017);  
  35.         useDatabase = mongoClient.getDatabase("zhaotong");  
  36.         // 自定義bucket name
  37.         gridFSBucket = GridFSBuckets.create(useDatabase, "zt_files");  
  38.         // 使用預設的名字
  39.         // gridFSBucket=GridFSBuckets.create(useDatabase);
  40.     }  
  41.     // 將檔案儲存到mongodb,返回儲存完成後的ObjectID
  42.     public ObjectId saveFile(String url) {  
  43.         InputStream ins = 

    相關推薦

    MongodbGFS儲存檔案java

    Mongodb 是一個開源的no-sql分散式資料庫,Mongodb也為我們提供了基於檔案的GFS分散式儲存系統。因此利用Mongodb我們完全可以實現一個分散式的檔案儲存以及管理。 下面的內容主要為大家介紹,如何利用java,將大檔案存入Mongodb資料庫中

    滑動視窗的最java

    【題目描述】給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。例如,如果輸入陣列{2,3,4,2,6,2,5,1}及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為{4,4,6,6,6,5}; 針對陣列{2,3,4,2,6,2,5,1}

    關於富文字編輯器—UEditorjava的使用,以及如何將UEditor的檔案/圖片上傳路徑改成絕對路徑

    突然發現好久沒寫部落格了,感覺變懶了,是要讓自己養成經常寫文章的習慣才行。既可以分享自己的所學,和所想,和大家一起討論,發現自己的不足的問題。 大家可能經常會用到富文字編輯器,今天我要說的是UEditor的使用,這是一個簡單易用的開源富文字編輯器。但是對於沒有用過的同學而言還是需要稍微瞭解一下的。 可能有些人

    pageoffice 儲存修改痕跡列表Java

    在oa辦公流程過程中,一份檔案會經過若干人的手中,也就意味著檔案會經歷多次修改,一次一次的修改,就應當記錄誰修改了哪些內容,因此,檔案的修改痕跡記錄就相當有必要。 在這裡為了區別於office文件自帶的修改痕跡列表,我自己添加了一個痕跡列表,使用起來更加方便。

    正向匹配java

    之前在網上尋找中文分詞使用的一些方法,看過一篇帖子(http://blog.csdn.net/niuox/article/details/11248567)是利用python寫的關於最大正向匹配的例子。 寫的還不錯,適合新入門的小白來學習學習。 後來因為執行程式的時候資料量

    git提交時 .gitignore過濾提交的內容 .gitignore檔案內容java

    標特殊顏色的地方記得修改為自己的專案名:#add files ignored by git#auto generated by idea *.idea*.iml#auto generated by eclipse*.project#add ignore .class*.cla

    劍指Offer面試題15Java:鏈表中倒數第K個結點

    head 計數器 easy sta 相同 ret white style 輸出 題目: 輸入一個鏈表。輸出該鏈表中倒數第k哥結點。 為了符合大多數人的習慣,本題從1開始計數。即鏈表的尾結點是倒數第1個結點。 比如一個鏈表有6個結點。從頭結點開始它們的值依次是1。2。

    排序算法java

    emp ive public while href ava 指針 循環 lec 1. 冒泡算法2. 快速排序3. 歸並排序4. 選擇排序5. 堆排序 排序算法 重要性不言而喻,很多算法問題往往選擇一個好的排序算法往往問題可以迎刃而解 1、冒泡算法

    高速排序Java

    content 輸入 println pop package ati 遞歸 子列 大於 package com.love.test; import java.util.Scanner; /** * @author huowolf *高速排序實現 *快排是十

    劍指Offer面試題43Java:n個骰子的點數

    pac pos max mod ins pri class pro bili 題目:把n個骰子仍在地上。全部骰子朝上一面的點數之和為s,輸入n,打印出s的全部可能的值出現的概率。 解法一:基於遞歸求骰子的點數,時間效率不夠高 如今我們考慮怎樣統計每個點數出現的次數。要向

    傻瓜方法求集合的全部子集問題java

    post 分解 ipp targe 找到 creat dojo class length 給定隨意長度的一個集合。用一個數組表示,如{"a", "b","c"},求它的全部子集。結果是{ {a},

    小米2017秋招真題——電話號碼分身問題Java

    imp spa ray 描述 mov lose port next can 原題描述如下: 通過對各個數字對應的英文單詞的分析,可以發現一些規律: 字母Z為0獨占,字母W為2獨占,字母U為4獨占,字母X為6獨占,字母G為8獨占; 在過濾一遍0、2、4、6、8後,字母O為1

    jieba分詞/jieba-analysisjava

    日本 word amp b- exception 鏈接 arp not unit 簡介 支持分詞模式Search模式,用於對用戶查詢詞分詞Index模式,用於對索引文檔分詞特性支持多種分詞模式全角統一轉成半角用戶詞典功能conf 目錄有整理的搜狗細胞詞庫因為性能原因,最新的

    基於Lucene框架的“虎撲籃球”網站搜索引擎java

    writer 用戶 源碼 static 數組 head 完整 需求 ash  1 引言 本次作業完成了基於Lucene的“虎撲籃球”網站搜索引擎,對其主要三個板塊---“最新新聞”(主要NBA新聞),“虎撲步行街”(類似貼吧性質),“虎撲濕乎乎”(籃球發帖區)進行頁

    名師帶你學微信開發Java

    IT 視頻 ava 14. ade BE src pict idt ======================================================= 長期更新IT編程視頻教程,資料收集整理不易,需要一點費用 有意者加QQ:277

    七大經典排序Java

    AR The 插入 構建 選擇 n個元素 升序 基準 互換 . 冒泡排序: 通過相鄰的兩個數的比較, 根據需要決定是否將兩個數互換位置, 然後將比較往前(或往後)推進. 最簡單的排序算法,直接上代碼。    for(i=0;i<lengt

    微信公眾號支付開發全過程java

    sdk 命令 所有 data 權限 {} servle res ast 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關註我的微信公眾號:好好學java,獲取優質學習資源。 一、微信官方文檔微信支付開發流程(公眾號支付) 首先我們到微信支付的官方文檔的開發步驟部分查

    數據結構java學習筆記序章

    簡單 size com bsp 一個 隊列 我們 程序 http 程序=數據結構+算法 序章做一個簡單的思維導圖,方便理解數據結構這門課的大綱,接下來我們將是按照線性表,棧,隊列,串,樹和圖的順序依次往下學。 數據結構(java版)學習筆記(序章)

    《劍指Offer》——SingletonJava

    slack 但是 span ref https 安全 創建對象 如果 懶漢式 1.單例模式的定義   單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 2.單例模式的特點   單例類只能有一個實例。   單例類必須自己創建自己的唯一實例。   單

    Redis 分布式鎖的正確實現方式 Java

    想要 uda 就是 tex implement 代碼實現 key eval() attach 前言 分布式鎖一般有三種實現方式:1. 數據庫樂觀鎖;2. 基於Redis的分布式鎖;3. 基於ZooKeeper的分布式鎖。本篇博客將介紹第二種方式,基於Redis實現分布式鎖。