关闭

mongodb与文件

937人阅读 评论(0) 收藏 举报
分类:
MongoDB GridFS是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取).GridFS是mongodb中用户存储大对象的工具,对于mongodb,BSON格式的数据(文档)存储有尺寸限制,最大为16M.但是在实际系统开发中,经常会有上传图片或者文件的功能,这些文件可能尺寸会很大..我们可以借用Gridfs来辅助实现这些文件的管理.
Mongo GFS的文件表是由 表名.files和 表名.chunks 构成,前者是文件信息构成,后者是文件的内容,两者通过_id与files_id建立关联。
GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为mongodb的一个文档(document)被存储在chunks集合中..gridfs模块会为每个文件创建chunks和files信息.每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中.files集合中的文档就是BSON格式,可以使用mongodb的索引等等特性,当然可以对files文档做数据分析。
使用场景:如果你的系统有如下情景
1) 有大量的上传图片(用户上传或者系统本身的文件发布等)
2) 文件的量级处于飞速增长,有可能打到单机操作系统自己的文件系统的查询性能瓶颈,甚至超过单机硬盘的扩容范围.
3) 文件的备份(不适用gridfs这种三方也可以做,但是不尽方便),文件系统访问的故障转移和修复..
4) 文件的索引,存储除文件本身以外还需要关联更多的元数据信息(比如,不仅仅存储文件,还要保存一些文件的发布式作者/发布时间/文件tag属性等等自定义信息)并且需要索引的...
5) 基于4),对文件的分类模糊,如果采用操作系统的文件系统,文件夹分类关系混乱或者无法分类时..
6) 当前系统是基于web的,对图片的访问根据url了规则路由的..(普通文件系统也可以)

7) 文件尺寸较小,而且众多,且文件有可能被迁移/删除等

mongodb读写文件:

 mongodb操作文件,主要是通过GridFS类。存储文件主要存放在fs中了,其中的fs是数据库默认的。
  
   
   并且GridFS是直接与数据库打交道,与collection集合无关。
   具体的操作如下:其中有相应的注释:
  
  1.    package com.mongo.dao;  
  2.   
  3. import java.io.File;  
  4. import java.util.List;  
  5.   
  6. import com.mongodb.BasicDBObject;  
  7. import com.mongodb.DB;  
  8. import com.mongodb.DBObject;  
  9. import com.mongodb.Mongo;  
  10. import com.mongodb.gridfs.GridFS;  
  11. import com.mongodb.gridfs.GridFSDBFile;  
  12. import com.mongodb.gridfs.GridFSInputFile;  
  13.   
  14. /**  
  15. * 使用mongodb对文件的读取操作  
  16. * @author lhy  
  17. *  
  18. */  
  19. public class GridFSTest {  
  20.       
  21.      public static void main(String[] args) throws Exception {  
  22.           //saveFile();  
  23.           readFile();  
  24.      }  
  25.       
  26.      /**  
  27.      * 存储文件  
  28.      */  
  29.      public static void saveFile() throws Exception{  
  30.            
  31.           //连接服务器  
  32.           Mongo mongo=new Mongo();  
  33.           //连接数据库  
  34.           DB db=mongo.getDB("testGridFS");  
  35.            
  36.           //文件操作是在DB的基础上实现的,与表和文档没有关系  
  37.           GridFS gridFS=null;  
  38.           gridFS=new GridFS(db);  
  39.            
  40.           String fileName="vltest.log";  
  41.           File readFile=new File("d:/"+fileName);  
  42.            
  43.           GridFSInputFile  mongofile=gridFS.createFile(readFile);  
  44.         //可以再添加属性  
  45.           mongofile.put("path","d:/"+fileName);  
  46.           //保存  
  47.           mongofile.save();           
  48.      }  
  49.       
  50.      /**  
  51.      * 读文件,读到磁盘上  
  52.      * @throws Exception  
  53.      */  
  54.      public static void readFile() throws Exception{  
  55.           //链接服务器  
  56.           Mongo mongo=new Mongo();  
  57.           //连接数据库  
  58.           DB db=mongo.getDB("testGridFS");  
  59.           GridFS gridFs=null;  
  60.           gridFs=new GridFS(db);  
  61.            
  62.           //查找条件  
  63.           DBObject query=new BasicDBObject();  
  64.         //查询的结果:  
  65.           List<GridFSDBFile> listfiles=gridFs.find(query);  
  66.         GridFSDBFile gridDBFile=listfiles.get(0);  
  67.          
  68.         //获得其中的文件名  
  69.         //注意 : 不是fs中的表的列名,而是根据调试gridDBFile中的属性而来  
  70.         String fileName=(String)gridDBFile.get("filename");  
  71.          
  72.         System.out.println("从Mongodb获得文件名为:"+fileName);  
  73.           
  74.         File writeFile=new File("d:/"+fileName);  
  75.         if(!writeFile.exists()){  
  76.              writeFile.createNewFile();  
  77.           }  
  78.          
  79.         //把数据写入磁盘中  
  80.         //查看相应的提示  
  81.         gridDBFile.writeTo("d:/a.txt");  
  82.         //写入文件中  
  83.         gridDBFile.writeTo(writeFile);         
  84.          
  85.         }  
  86. }  


spring mongodb 读写文件:

先注入MongoDbFactory

[java] view plaincopy
  1. @Autowired  
  2.   private MongoDbFactory mongoDbFactory;  

获得DB对象

[java] view plaincopy
  1. DB db = mongoDbFactory.getDb();  

保存文件(其中FS_NAME相当于gridfs文件系统的表名,可以有多个)

[java] view plaincopy
  1. public boolean saveFile(File file, String fileName, String contentType,  
  2.       DBObject metaData) {  
  3.        
  4.     GridFSInputFile gfsInput;  
  5.     try {     
  6.       gfsInput = new GridFS(db, FS_NAME).createFile(file);  
  7.       gfsInput.setFilename(fileName);  
  8.       gfsInput.setContentType(contentType);  
  9.       gfsInput.setMetaData(metaData);  
  10.       gfsInput.save();  
  11.     } catch (IOException e) {  
  12.       log.error(e, e);  
  13.       return false;  
  14.     }  
  15.     return true;  
  16.   }  


通过文件名读取文件

[java] view plaincopy
  1. public GridFSDBFile findFileByName(String fileName){  
  2.     GridFSDBFile gfsFile ;  
  3.     try {        
  4.       gfsFile = new GridFS(db, FS_NAME).findOne(fileName);  
  5.     } catch (Exception e) {  
  6.       log.error(e, e);  
  7.       return null;  
  8.     }  
  9.     return gfsFile;  
  10.   }  


通过id读取文件

[java] view plaincopy
  1. public GridFSDBFile findFileById(String id){  
  2.     GridFSDBFile gfsFile ;  
  3.     try {        
  4.       gfsFile = new GridFS(db, FS_NAME).find(new ObjectId(id));  
  5.     } catch (Exception e) {  
  6.       log.error(e, e);  
  7.       return null;  
  8.     }  
  9.     return gfsFile;  
  10.   }  

输出文件到OutputStream

[java] view plaincopy
  1. private boolean writeToOutputStream(OutputStream out, GridFSDBFile gfsFile) {  
  2.     try {       
  3.       gfsFile.writeTo(out);  
  4.     } catch (IOException e) {  
  5.       log.error(e, e);  
  6.       return false;  
  7.     }  
  8.     return true;  
  9.   }  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:337448次
    • 积分:4478
    • 等级:
    • 排名:第6882名
    • 原创:65篇
    • 转载:343篇
    • 译文:0篇
    • 评论:23条