Java Maven项目中使用MongoDB GridFS上传音频图片_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java Maven项目中使用MongoDB GridFS上传音频图片

Java Maven项目中使用MongoDB GridFS上传音频图片

 2017/8/1 15:38:59  aoyouzi  程序员俱乐部  我要评论(0)
  • 摘要:一、文件系统先简单的介绍一下文件系统和分布式文件系统1、文件系统:是操作系统用来存取文件的,计算机通过文件系统存放数据。大部分均基于磁盘存储,典型的文件系统包括unix的UFS,NTFS是windowNT的文件存储系统。传统文件系统主要面临的问题就是磁盘容量不够时,需要扩容才可继续进行文件存储,如同咱电脑内存不够加块内存条。2、分布式文件存储系统:同传统的纵向扩容不同,分布式文件存储系统通过存储文件节点,各节点通信形成文件系统网络,各节点通过网络进行数据传输
  • 标签:使用 图片 上传 Java 项目 MongoDB Maven
一、文件系统

class="MsoNormal" style="color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">?

先简单的介绍一下文件系统和分布式文件系统

1、文件系统:是操作系统用来存取文件的,计算机通过文件系统存放数据。大部分均基于磁盘存储,典型的文件系统包括unix?的UFS,NTFS是window?NT的文件存储系统。传统文件系统主要面临的问题就是磁盘容量不够时,需要扩容才可继续进行文件存储,如同咱电脑内存不够加块内存条。

2、分布式文件存储系统:同传统的纵向扩容不同,分布式文件存储系统通过存储文件节点,各节点通信形成文件系统网络,各节点通过网络进行数据传输。就像原来密集的数据信息通过一张节点织网,分布式文件系统负责对节点进行存储,数据文件可存储于其他存储系统中。

二、GridFS?文件系统

?GridFS是分布式文件存储系统的典型代表。为MongoDB提供的数据存储解决方案,专门供大数据文件存储使用,主要用于存储视频、音频、图片,GridFS主要适用于文件数量较大的文件存储。

GridFS并非mongodb的特有,不过是mongo选择使用这样一种文件存储解决方案进行存储自己的数据。用户上传的数据存储于mongo的集合中,【mongoDB的集合类似于关系数据库的表】

?

三、Java中使用mongo?GridFS进行数据操作

介绍了GridFS的原理,下面以上传、下载本地PDF文件为例,演示如何在java?maven项目中使用mongo进行数据操作。

1、整体流程

使用GridFS,首先调用客户端驱动程序提供的GFS?API【如java中引入mongojar包】来将数据块进行分割,准备上传,如果是下载则利用API进行数据合并,保存到mongo集合中。

?

2、代码演示

?(1)首先新建maven项目

?(2)在mongoDB官网下载mongo驱动jar包,

???????? 下载地址如下:https://docs.mongodb.org/ecosystem/drivers/?

?????????点击MongoDB?Java?Driver,将驱动坐标拷贝到maven?pom文件中。

?

?

[html]?view plain?copy ?
  1. <dependencies>??
  2. ????<dependency>??
  3. ????????<groupId>org.mongodb</groupId>??
  4. ????????<artifactId>mongodb-driver</artifactId>??
  5. ????????<version>3.2.0</version>??
  6. ????</dependency>??
  7. </dependencies>??

?

?

?

?(3)创建数据库连接、文件上传下载操作

?

[java]?view plain?copy ?
  1. public?class?GridFSDemo?{??
  2. ????public?static?void?main(String[]?args)?throws?FileNotFoundException??
  3. ????{??
  4. ????????/*?
  5. ?????????*?1、创建数据库连接?
  6. ?????????*/??
  7. ????????Mongo?client=?new?Mongo("192.168.22.246",27017);??
  8. ????????//取得数据库对象??
  9. ????????DB?db=client.getDB("mongoTest");??
  10. ??????????
  11. ????????String?collectionName="mongoCollectionTest";??
  12. ????????//创建数据库对象中GridFS集合??
  13. ????????GridFS?gridFS=?new?GridFS(db,collectionName);?????????
  14. ??????????
  15. ????????/*?
  16. ?????????*?2、上传文件?
  17. ?????????*/??
  18. ????????//创建测试文件,mongo?默认存在该文件??
  19. ????????File?file=new?File("F:/Java/疯狂JAVA讲义.pdf");??
  20. ????????FileInputStream?fileInputStream=new?FileInputStream(file);??
  21. ??????????
  22. ????????//创建gridFS文件数据流??
  23. ????????GridFSInputFile?createFile=gridFS.createFile(fileInputStream);??
  24. ??????????
  25. ????????//设置文件属性??
  26. ????????createFile.put("filename",?"123Test.pdf");??
  27. ????????createFile.put("contentType",?"application/pdf");??
  28. ????????createFile.save();??
  29. ??????????
  30. ??????????
  31. ????????/*?
  32. ?????????*?3、根据id查询上传文件?
  33. ?????????*/??
  34. ????????GridFSDBFile?findOne=?gridFS.findOne(new?BasicDBObject("_id",createFile.getId()));??
  35. ????????System.out.print(findOne);??
  36. ??????????
  37. ????????/*?
  38. ?????????*?4、查询所有文件列表?
  39. ?????????*?DBCursor?数据库游标?
  40. ?????????*/??
  41. ????????DBCursor?fileList=gridFS.getFileList();??
  42. ????????while(fileList.hasNext())??
  43. ????????{??
  44. ????????????System.out.print(fileList.next());??
  45. ????????}??
  46. ??????????
  47. ????????/*?
  48. ?????????*5、?删除文件?
  49. ?????????*/??
  50. ????????gridFS.remove(new??BasicDBObject("_id",createFile.getId()));??
  51. ????????client.close();??
  52. ????}??

?

?

?

?(4)程序效果展示

如图,在mongDB中新建名为【mongoTest】的数据库和【mongoCollectionTest】集合,将【123Test.pdf】上传到该集合中。

四、项目应用

在ITOO项目中tool模块也封装了使用GridFS对mongoDB进行操作的底层方法,主要同【三】中的代码流程一致,通过创建数据库连接,建立数据库、集合,获取本地文件路径,创建文件输入流通过save方法将文件上传到数据库中。同样也有通过id查询、遍历查询所有文件列表、删除等方法。

?

[java]?view plain?copy ?
  1. /**?
  2. ?????*?@MethodName??:?getMongo?
  3. ?????*?@Description?:?获取数据连接?
  4. ?????*?@return?返回mongon?
  5. ?????*/??
  6. ????private?Mongo?getMongo(){??
  7. ????????Mongo?mongo=null;??
  8. ????????try?{??
  9. ????????????mongo?=?new?Mongo("192.168.22.246",27017);??
  10. ??????????????
  11. ????????}?catch?(Exception?e)?{??
  12. ????????????e.printStackTrace();??
  13. ????????}??
  14. ????????return?mongo;??
  15. ????}??
  16. ??????
  17. ????/**?
  18. ?????*??@MethodName?:?uploadFile?
  19. ?????*?@Description?:?上传文件?
  20. ?????*?@param?file?:文件,File类型?
  21. ?????*?@param?id????:唯一标示文件,可根据id查询到文件.必须设置?
  22. ?????*?@param?dbName?:库名,每个系统使用一个库?
  23. ?????*?@param?collectionName:集合名,如果传入的集合名库中没有,则会自动新建并保存?
  24. ?????*?@param?map:放入你想要保存的属性,例如文件类型(“congtentType”".jpg"),字符串类型,区分大小写,如果属性没有的话会自动创建并保存?
  25. ?????*/??
  26. ???public?void?uploadFile(File?file?,String?id,String?dbName,String?collectionName,LinkedHashMap<String,?Object>?map){??
  27. ???????//把mongoDB的数据库地址配置在外部。??
  28. ????????try?{??
  29. ????????????Mongo?mongo?=getMongo();???
  30. ????????????//每个系统用一个库??
  31. ????????????DB?db=?mongo.getDB(dbName);??
  32. ????????????System.out.println(db.toString());??
  33. ????????????//每个库中可以分子集??
  34. ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
  35. ??????????????
  36. ????????????//?创建gridfsfile文件??
  37. ????????????GridFSFile?gridFSFile?=?gridFS.createFile(file);??
  38. ????????????//判断是否已经存在文件,如果存在则先删除??
  39. ????????????GridFSDBFile?gridFSDBFile=getFileById(id,?dbName,?collectionName);??
  40. ????????????if(gridFSDBFile!=null){??
  41. ????????????????deleteFile(id,?dbName,?collectionName);??
  42. ????????????}??
  43. ????????????//将文件属性设置??
  44. ????????????gridFSFile.put("_id",?id);??
  45. ????????????//循环设置的参数??
  46. ????????????if?(map?!=?null?&&?map.size()?>?0)?{??
  47. ????????????????for?(String?key?:?map.keySet())?{??
  48. ????????????????????gridFSFile.put(key,?map.get(key));??
  49. ????????????????}??
  50. ????????????}??
  51. ????????????//保存上传??
  52. ????????????gridFSFile.save();??
  53. ????????}?catch?(Exception?e)?{??
  54. ????????????e.printStackTrace();??
  55. ????????}??
  56. ????}??
  57. ?????
  58. ???/**???
  59. ????*?@MethodName???:?deleteFile?
  60. ????*?@Description??:?删除文件?
  61. ????*?@param?id:文件对应的id?
  62. ????*?@param?dbName:文件所在的库?
  63. ????*?@param?collectionName:文件所在的集合?
  64. ????*/??
  65. ???public?void?deleteFile(String?id,String?dbName,String?collectionName){??
  66. ??
  67. ????????try?{??
  68. ????????????//获得mongoDB数据库连接。??
  69. ????????????Mongo?mongo?=getMongo();???
  70. ????????????//获得库??
  71. ????????????DB?db=?mongo.getDB(dbName);??
  72. ????????????//获得子集??
  73. ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
  74. ????????????//删除文件??
  75. ????????????DBObject?query=new?BasicDBObject("_id",?id);??
  76. ????????????gridFS.remove(query);??
  77. ????????}?catch?(Exception?e)?{??
  78. ????????????e.printStackTrace();??
  79. ????????}??
  80. ???}??
  81. ?????
  82. ???/**?
  83. ????*?批量删除文件?
  84. ????*?@MethodName???:?deleteFileByIds?
  85. ????*?@Description??:?TODO?
  86. ????*?@param?ids?
  87. ????*?@param?dbName?
  88. ????*?@param?collectionName?
  89. ????*??
  90. ????*/??
  91. ???public?void?deleteFileByIds(String[]?ids,String?dbName,String?collectionName){??
  92. ???????try?{??
  93. ???????????//获得mongoDB数据库连接。??
  94. ???????????Mongo?mongo?=getMongo();???
  95. ???????????//获得库??
  96. ???????????DB?db=?mongo.getDB(dbName);??
  97. ???????????//获得子集??
  98. ???????????GridFS?gridFS=?new?GridFS(db,collectionName);??
  99. ???????????Map<String,String>?map?=?new?HashMap<String,String>();??
  100. ???????????for(int?i=0;i<ids.length;i++){??
  101. ?????????????//删除文件??
  102. ???????????????DBObject?query=new?BasicDBObject("_id",?ids[i]);??
  103. ???????????????gridFS.remove(query);??
  104. ???????????}???????????
  105. ???????}?catch?(Exception?e)?{??
  106. ???????????e.printStackTrace();??
  107. ???????}??
  108. ??}??
  109. ?????
  110. ???/**?
  111. ????*?@MethodName???:?getFileById?
  112. ????*?@Description??:?根据Id获得文件?
  113. ????*?@param?id?:文件Id?
  114. ????*?@param?dbName:?数据库名?
  115. ????*?@param?collectionName:集合名?
  116. ????*?@return?GridFSDBFile?
  117. ????*/??
  118. ???public?GridFSDBFile?getFileById(String?id,String?dbName,String?collectionName){??
  119. ???????GridFSDBFile?gridFSDBFile=null;??
  120. ???????try?{??
  121. ????????????//获得mongoDB数据库连接。??
  122. ????????????Mongo?mongo?=getMongo();???
  123. ????????????//获得库??
  124. ????????????DB?db=?mongo.getDB(dbName);??
  125. ????????????//获得子集??
  126. ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
  127. ????????????//获得文件??
  128. ????????????DBObject?query=new?BasicDBObject("_id",?id);??
  129. ????????????gridFSDBFile=gridFS.findOne(query);??
  130. ????????}?catch?(Exception?e)?{??
  131. ????????????e.printStackTrace();??
  132. ????????}??
  133. ???????//返回数据??
  134. ???????return?gridFSDBFile;??
  135. ???}??
  136. ?????
  137. ???/**查询集合中所有文件?
  138. ????*?@MethodName???:?getAllFile?
  139. ????*?@Description??:?TODO?
  140. ????*?@param?dbName?
  141. ????*?@param?collectionName????*?
  142. ????*?@return?
  143. ????*/??
  144. ???public?List<GridFSDBFile>?getAllFile(String?dbName,String?collectionName){??
  145. ???????List<GridFSDBFile>?gridFSDBFileList=null;??
  146. ???????try?{??
  147. ????????????//获得mongoDB数据库连接。??
  148. ????????????Mongo?mongo?=getMongo();???
  149. ????????????//获得库??
  150. ????????????DB?db=?mongo.getDB(dbName);??
  151. ????????????//获得子集??
  152. ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
  153. ????????????//获得文件??
  154. ????????????DBObject?query=new?BasicDBObject();//空的构造??
  155. ????????????gridFSDBFileList?=?gridFS.find(query);??
  156. ????????}?catch?(Exception?e)?{??
  157. ????????????e.printStackTrace();??
  158. ????????}??
  159. ???????//返回数据??
  160. ???????return?gridFSDBFileList;??
  161. ???}??

通过对GridFS结合java file类,实现了对各音频、视频、图片等数据在mongoDB上的存储,不可否认的是,作为NoSQL数据库mongoDB利用其自身独到之处被众多大型视频网站项目所青睐,GridFS便是其点睛之笔。

?

http://blog.csdn.net/daybreak1209/article/details/50471262

发表评论
用户名: 匿名