MongoDB GridFS java存取文件

GridFS首先会在当前数据库创建两个集合:"fs.files"和"fs.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。分块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么知道它对应的文件二进制数据在哪些块呢?那是因为在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int型)"n",它表明这些块的先后顺序。这两个集合名中的"fs"也是可以通过参数自定义的。

官方文档
http://www.mongodb.org/display/DOCS/GridFS
http://www.mongodb.org/display/DOCS/GridFS+Specification
http://api.mongodb.org/java/2.13/

下面我们用mongo-Java-driver来实现文件的读取。

MongoGridFSTest.java

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.slimsmart.mongodb.demo.crud;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.net.UnknownHostException;  
  8.   
  9. import com.mongodb.BasicDBObject;  
  10. import com.mongodb.DB;  
  11. import com.mongodb.DBObject;  
  12. import com.mongodb.MongoClient;  
  13. import com.mongodb.gridfs.GridFS;  
  14. import com.mongodb.gridfs.GridFSDBFile;  
  15. import com.mongodb.gridfs.GridFSInputFile;  
  16.   
  17. public class MongoGridFSTest {  
  18.       
  19.     private static MongoClient mongoClient = null;  
  20.     private static DB db = null;  
  21.     private static GridFS gridFS = null;  
  22.    
  23.     private static String dbName = "gridfs";  
  24.   
  25.     public static void main(String[] args) throws UnknownHostException, Exception {  
  26.         mongoClient = new MongoClient("192.168.36.61"23000);  
  27.         db = mongoClient.getDB(dbName);  
  28.         gridFS = new GridFS(db);  
  29.           
  30.         String file = "src/main/resources/20150315172324.png";  
  31.         if(!new File(file).exists()){  
  32.             System.out.println("file is not exists.");  
  33.         }  
  34.         String fileName = "20150315172324.png";  
  35.         //把文件保存到gridfs中,并以文件的md5值为id  
  36.         save(new FileInputStream(file), fileName,fileName);  
  37.         //据文件名从gridfs中读取到文件  
  38.            
  39.         GridFSDBFile gridFSDBFile = getByFileName(fileName);  
  40.         if(gridFSDBFile != null){  
  41.             System.out.println("filename:" + gridFSDBFile.getFilename());  
  42.             System.out.println("md5:" + gridFSDBFile.getMD5());  
  43.             System.out.println("length:" + gridFSDBFile.getLength());  
  44.             System.out.println("uploadDate:" + gridFSDBFile.getUploadDate());  
  45.             System.out.println("--------------------------------------");  
  46.             gridFSDBFile.writeTo(new FileOutputStream("src/main/resources/20150315172324_out.png"));  
  47.         }else{  
  48.             System.out.println("can not get file by name:" + fileName);  
  49.         }  
  50.     }  
  51.       
  52.     /** 
  53.      * 用给出的id,保存文件,透明处理已存在的情况 
  54.      * id 可以是string,long,int,org.bson.types.ObjectId 类型 
  55.      * @param in 
  56.      * @param id 
  57.      */  
  58.     public static void save(InputStream in, Object id,String fileName){  
  59.         DBObject query  = new BasicDBObject("_id", id);  
  60.         GridFSDBFile gridFSDBFile = gridFS.findOne(query);  
  61.         if(gridFSDBFile == null){  
  62.              GridFSInputFile gridFSInputFile = gridFS.createFile(in);  
  63.              gridFSInputFile.setId(id);  
  64.              gridFSInputFile.setFilename(fileName);  
  65.              //gridFSInputFile.setChunkSize();  
  66.              //gridFSInputFile.setContentType();  
  67.              //gridFSInputFile.setMetaData();  
  68.              gridFSInputFile.save();  
  69.         }  
  70.     }  
  71.       
  72.     /** 
  73.      * 据id返回文件 
  74.      * @param id 
  75.      * @return 
  76.      */  
  77.     public static GridFSDBFile getById(Object id){  
  78.         DBObject query  = new BasicDBObject("_id", id);  
  79.         GridFSDBFile gridFSDBFile = gridFS.findOne(query);  
  80.         return gridFSDBFile;  
  81.     }  
  82.       
  83.     /** 
  84.      * 据文件名返回文件,只返回第一个 
  85.      * @param fileName 
  86.      * @return 
  87.      */  
  88.     public static GridFSDBFile getByFileName(String fileName){  
  89.         DBObject query  = new BasicDBObject("filename", fileName);  
  90.         GridFSDBFile gridFSDBFile = gridFS.findOne(query);  
  91.         return gridFSDBFile;  
  92.     }  
  93. }  

参考文章:

1.MongoDB结合Spring存储文件(图片、音频等等)


http://blog.csdn.net/zhu_tianwei/article/details/44278455

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页