Mongodb 的GridFS

       假如在项目中已经采取了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 查看本文章

猜你喜欢

转载自chenhua-1984.iteye.com/blog/2158376