假如在项目中已经采取了Mongodb,那么可以不用在重新设计文件系统了,应为MongoDb本身有的Gridfs就是一个很好的文件系统,Mongodb会利用自己的分片或者复制机制,对于文件存储和故障恢复都很容易,分配数据空间时一般是2GB为一块,不会产生磁盘碎片。
Mongodb内部的基本思想是将大文件分成很多块,妹块做为一个单独的文档存储,使用files和chunks来控制。这样就可以存储大文件。
Mongodb 的GridFS使用比较简单,Shell对其提供了支持,mongofiles程序提供了几个指令:put,get,list,search,delete 用来操作文件。
文件存储后有以下几个字段可以读取 :_id,length,chunkSize,uploadDate,md5(可以拿来校验是否上传完整)
下面是采用JAVA实现对Mongodb的GridFS的存储功能部分代码
package com.nbey.data.dzbl.business.impl; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import com.mongodb.DB; import com.mongodb.gridfs.GridFS; import com.nbey.data.dzbl.business.IGridfsDao; import com.nbey.data.dzbl.dao.support.AbstractBaseMongoTemplete; import com.nbey.data.dzbl.domain.EMRECORD; import com.nbey.data.dzbl.domain.Gridfsfile; import com.nbey.data.dzbl.fileio.ReadTxtContent; import com.mongodb.gridfs.GridFSFile; public class GridfsDao extends AbstractBaseMongoTemplete implements IGridfsDao { static GridFS gridFS = null; @Override public void putFile(List<File> list) { DB db = this.mongoTemplate.getDb(); gridFS = new GridFS(db); Gridfsfile fs = null; String abpath = null; String parent = null; String emrText =null; for (File file : list) { fs = new Gridfsfile(); abpath = file.getAbsolutePath(); parent = file.getParent(); // regex为\\\\,因为在java中\\表示一个\,而regex中\\也表示\,所以当\\\\解析成regex的时候为\\。 // 由于unix中file.separator为斜杠"/",下面这段代码可以处理windows和unix下的所有情况: String temp[] = parent.replaceAll("\\\\", "/").split("/"); if (temp.length > 1) { parent = temp[temp.length - 1]; } fs.setFilename(parent + "$$$$" + file.getName()); fs.setContentType(file.getName().substring( file.getName().lastIndexOf("."))); fs.setUploaded(new Date()); saveFile(new File(abpath), fs.getFilename()); EMRECORD emr = new EMRECORD(); if (fs.getFilename().startsWith("M")) { emr.setoUTPATNO(fs.getFilename()); } else { emr.setiNPATNO(fs.getFilename()); } emr.setfILETYPE(fs.getFilename().substring( fs.getFilename().lastIndexOf("."))); emr.setaRCHIVED("Y"); if (".txt".equals(fs.getFilename().substring( fs.getFilename().lastIndexOf(".")))) { emr.seteMRTEXT(ReadTxtContent.readTxtFile(abpath)); } saveToEMRECORD(emr); } } public void saveFile(File file, String fileName) { try { GridFSFile mongofile = gridFS.createFile(file); mongofile.put("filename", fileName); mongofile.put("uploadDate", new Date()); mongofile.put("contentType", fileName.substring(fileName.lastIndexOf("."))); mongofile.save(); } catch (IOException e) { e.printStackTrace(); } } @Override public void saveToEMRECORD(EMRECORD emr) { this.mongoTemplate.insert(emr, "emrecord"); } }
扫描二维码关注公众号,回复:
579801 查看本文章