mongodb自带的分布式文件系统
《mongodb自带的分布式文件系统》要点: 欢迎参与《mongodb自带的分布式文件系统》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。
好处如下: 1.可以有Replication; 2.可以利用MongoDB的权限访问控制; 3.可以利用现成的MongoDB备份方式; 今天主要是学习如何使用data这个框架来操作GridFS,首先配置gridFs的模板类 <!-- Mongodb gridFs的模板 --> <bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate"> <constructor-arg ref="mongoDbFactory" /> <constructor-arg ref="mappingConverter" /> </bean> /** * 上传文件 * @author yinjihuan * @throws Exception */ public static void uploadFile() throws Exception { File file = new File("/Users/yinjihuan/Downlaods/logo.png"); InputStream content = new FileInputStream(file); //存储文件的额外信息,比如用户ID,后面要查询某个用户的所有文件时就可以直接查询 DBObject metadata = new BasicDBObject("userId","1001"); GridFSFile gridFSFile = gridFsTemplate.store(content,file.getName(),"image/png",metadata); String fileId = gridFSFile.getId().toString(); System.out.println(fileId); } 文件默认是上传到数据中的fs.files和fs.chunks中 files是用来存储文件的信息,文件名,md5,文件大小,还有刚刚的metadata,上传时间等等数据,数据格式如下: { "_id": ObjectId("57c17bb0d4c666b6e53ba795"), "metadata": { "user_id": 1001 }, "filename": "file", "aliases": null, "chunkSize": NumberLong(261120), "uploadDate": ISODate("2016-09-08T11:38:24.999Z"), "length": NumberLong(165253), "contentType": "image/png", "md5": "668727a643ddd6df2e98f164d9fc90fd" } chunks则是用来存储文件内容的 1.files_id就是文件的ID,也就是files集合中的_id 2.n是文件块的索引,通常文件会被分割成256KB的块大小存储 3.data就是文件的数据了
{ "_id": ObjectId("57c18993d4c6355ffeb6f8ae"), "files_id": ObjectId("57c17bb0d4c666b6e53ba795"), "n": 0, "data": BinData(0,"iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA") } { "_id": ObjectId("57c18993d4c6355ffeb6f8ae"), "n": 1, "data": BinData(1,"iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA") } /** * 根据文件ID查询文件 * @author yinjihuan * @param fileId * @return * @throws Exception */ public static GridFSDBFile getFile(String fileId) throws Exception { return gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId))); } /** * 根据文件ID删除文件 * @author yinjihuan * @param fileId * @throws Exception */ public static void removeFile(String fileId) throws Exception { gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId))); } 如果在Spring mvc中想直接访问存储的文件也很简单,直接通过文件ID查询该文件,然后直接输出到response就是了,记得要设置ContentType,这时就明白为什么存储的时候要把ContentType存起来了. /** * 访问图片 * @author yinjihuan * @param fileId * @param request * @param response */ @RequestMapping(value = "/image/{fileId}") @ResponseBody public void getImage(@PathVariable String fileId,HttpServletResponse response) { try { GridFSDBFile gridfs = filesService.getFile(fileId); response.setContentType(gridfs.getContentType()); OutputStream out = response.getOutputStream(); gridfs.writeTo(out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 源码下载:https://github.com/yinjihuan/cxytiandi (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |