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

 一、 文件系统

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

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集合中。

MongoDB篇——Java Maven项目中使用MongoDB GridFS上传音频图片_第1张图片

2、代码演示

 (1)首先新建maven项目

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

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

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

 MongoDB篇——Java Maven项目中使用MongoDB GridFS上传音频图片_第2张图片


    
        org.mongodb
        mongodb-driver
        3.2.0
    

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

public class GridFSDemo {
	public static void main(String[] args) throws FileNotFoundException
	{
		/*
		 * 1、创建数据库连接
		 */
		Mongo client= new Mongo("192.168.22.246",27017);
		//取得数据库对象
		DB db=client.getDB("mongoTest");
		
		String collectionName="mongoCollectionTest";
		//创建数据库对象中GridFS集合
		GridFS gridFS= new GridFS(db,collectionName);		
		
		/*
		 * 2、上传文件
		 */
		//创建测试文件,mongo 默认存在该文件
		File file=new File("F:/Java/疯狂JAVA讲义.pdf");
		FileInputStream fileInputStream=new FileInputStream(file);
		
		//创建gridFS文件数据流
		GridFSInputFile createFile=gridFS.createFile(fileInputStream);
		
		//设置文件属性
		createFile.put("filename", "123Test.pdf");
		createFile.put("contentType", "application/pdf");
		createFile.save();
		
		
		/*
		 * 3、根据id查询上传文件
		 */
		GridFSDBFile findOne= gridFS.findOne(new BasicDBObject("_id",createFile.getId()));
		System.out.print(findOne);
		
		/*
		 * 4、查询所有文件列表
		 * DBCursor 数据库游标
		 */
		DBCursor fileList=gridFS.getFileList();
		while(fileList.hasNext())
		{
			System.out.print(fileList.next());
		}
		
		/*
		 *5、 删除文件
		 */
		gridFS.remove(new  BasicDBObject("_id",createFile.getId()));
		client.close();
	}

 (4)程序效果展示

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

MongoDB篇——Java Maven项目中使用MongoDB GridFS上传音频图片_第3张图片

四、项目应用

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

/**
	 * @MethodName	: getMongo
	 * @Description	: 获取数据连接
	 * @return 返回mongon
	 */
	private Mongo getMongo(){
		Mongo mongo=null;
		try {
			mongo = new Mongo("192.168.22.246",27017);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return mongo;
	}
	
	/**
	 *  @MethodName	: uploadFile
	 * @Description	: 上传文件
	 * @param file :文件,File类型
	 * @param id	:唯一标示文件,可根据id查询到文件.必须设置
	 * @param dbName :库名,每个系统使用一个库
	 * @param collectionName:集合名,如果传入的集合名库中没有,则会自动新建并保存
	 * @param map:放入你想要保存的属性,例如文件类型(“congtentType”".jpg"),字符串类型,区分大小写,如果属性没有的话会自动创建并保存
	 */
   public void uploadFile(File file ,String id,String dbName,String collectionName,LinkedHashMap map){
	   //把mongoDB的数据库地址配置在外部。
		try {
			Mongo mongo =getMongo(); 
			//每个系统用一个库
			DB db= mongo.getDB(dbName);
			System.out.println(db.toString());
			//每个库中可以分子集
			GridFS gridFS= new GridFS(db,collectionName);
			
			// 创建gridfsfile文件
			GridFSFile gridFSFile = gridFS.createFile(file);
			//判断是否已经存在文件,如果存在则先删除
			GridFSDBFile gridFSDBFile=getFileById(id, dbName, collectionName);
			if(gridFSDBFile!=null){
				deleteFile(id, dbName, collectionName);
			}
			//将文件属性设置到
			gridFSFile.put("_id", id);
			//循环设置的参数
			if (map != null && map.size() > 0) {
				for (String key : map.keySet()) {
					gridFSFile.put(key, map.get(key));
				}
			}
			//保存上传
			gridFSFile.save();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
   
   /**  
    * @MethodName	: deleteFile
    * @Description	: 删除文件
    * @param id:文件对应的id
    * @param dbName:文件所在的库
    * @param collectionName:文件所在的集合
    */
   public void deleteFile(String id,String dbName,String collectionName){

		try {
			//获得mongoDB数据库连接。
			Mongo mongo =getMongo(); 
			//获得库
			DB db= mongo.getDB(dbName);
			//获得子集
			GridFS gridFS= new GridFS(db,collectionName);
			//删除文件
			DBObject query=new BasicDBObject("_id", id);
			gridFS.remove(query);
		} catch (Exception e) {
			e.printStackTrace();
		}
   }
   
   /**
    * 批量删除文件
    * @MethodName	: deleteFileByIds
    * @Description	: TODO
    * @param ids
    * @param dbName
    * @param collectionName
    * 
    */
   public void deleteFileByIds(String[] ids,String dbName,String collectionName){
       try {
           //获得mongoDB数据库连接。
           Mongo mongo =getMongo(); 
           //获得库
           DB db= mongo.getDB(dbName);
           //获得子集
           GridFS gridFS= new GridFS(db,collectionName);
           Map map = new HashMap();
           for(int i=0;i getAllFile(String dbName,String collectionName){
       List gridFSDBFileList=null;
       try {
            //获得mongoDB数据库连接。
            Mongo mongo =getMongo(); 
            //获得库
            DB db= mongo.getDB(dbName);
            //获得子集
            GridFS gridFS= new GridFS(db,collectionName);
            //获得文件
            DBObject query=new BasicDBObject();//空的构造
            gridFSDBFileList = gridFS.find(query);
        } catch (Exception e) {
            e.printStackTrace();
        }
       //返回数据
       return gridFSDBFileList;
   }
通过对GridFS结合java file类,实现了对各音频、视频、图片等数据在mongoDB上的存储,不可否认的是,作为NoSQL数据库mongoDB利用其自身独到之处被众多大型视频网站项目所青睐,GridFS便是其点睛之笔。期待进一步发现。

你可能感兴趣的:(【深入Java】)