`
Ithaca
  • 浏览: 2834 次
  • 来自: 南昌
社区版块
存档分类
最新评论

Mongodb使用GridFS存储文件

    博客分类:
  • Java
阅读更多
先来看一个简单的例子:

public class Mongofs {
	
	private static final String USER = "rechard";
	private static final String PASS = "root";

	public static void main(String[] args) throws Exception 
	{
		
		Mongo m = new Mongo("localhost");
		DB db = m.getDB("newdb");
		boolean auth = db.authenticate(USER, PASS.toCharArray());

		if (auth) 
		{
			DBCollection coll = db.getCollection("testColl");
			db.requestStart();
			
			String file, newFilename, bucket, saveTo;			
			bucket = "fs";			
			newFilename = "mm";
			file = "/home/rechard/Pictures/105066115253.jpg";
			saveTo = "/home/rechard/Desktop/1.jpg";
			
			storeFile(db, bucket, file, newFilename);
			
			findSingleFileAndSaveAs(db, bucket, newFilename, saveTo);
			
			remove(db, bucket, newFilename);
			
			db.requestDone();
		} 	
	}

	/**
	 * 存储文件到mongo
	 * @param db
	 * @param bucket
	 * @param file
	 * @param fn
	 * @throws Exception
	 */
	static void storeFile(DB db, String bucket, String file, String fn)
			throws Exception
	{	
		File files = new File(file);
		// 创建一个GridFS实例
		GridFS gfs = new GridFS(db, bucket);
		GridFSInputFile gfsInput = gfs.createFile(files);
		// 指定一个GridFS实体的名字
		gfsInput.setFilename(fn);
		gfsInput.save();
	}

	/**
	 * 查找单个文件并保存
	 * @param db
	 * @param bucket
	 * @param fn
	 * @param saveTo
	 * @throws Exception
	 */
	static void findSingleFileAndSaveAs(DB db, String bucket, String fn, String saveTo) 
			throws Exception
	{
		GridFS gfs = new GridFS(db, bucket);
		GridFSDBFile dbFile = gfs.findOne(fn);
		//System.out.println(dbFile);
		if (dbFile != null) System.out.println("file size:" + dbFile.writeTo(saveTo));
	}
	
	/**
	 * 从mongodb删除文件
	 * @param db
	 * @param bucket
	 * @param fn
	 */
	static void remove(DB db, String bucket, String fn)
	{
		GridFS gfs = new GridFS(db, bucket);
		gfs.remove(fn);
	}
}


以上代码仅供测试和抛砖引玉,不作具体解决方法,详细信息请参考http://www.mongodb.org/

1.关于GridFS的构造函数参数bucket,我认为是一个标识符,即在newdb这个数据库下,不同的bucket代表不同的表(类型),而一个类型又可以包含多个文件。当然,bucket也不是必须要传的,如果觉得麻烦可以使用另一个Constructor-GridFS(DB db),默认bucket是"fs".

2.一个文件在mongodb里存储的文件,看起来是大概是这样的:

详细的解释如下:
{
  "_id" : <unspecified>,                  // 文件的唯一标示id,由mongo自动创建
  "length" : data_number,                 // 文件的大小
  "chunkSize" : data_number,              // 块大小,默认是256k
  "uploadDate" : data_date,               // 存储时间
  "md5" : data_string                     // 文件的md5码
}


3.关于GridFSDBFile的writeTo方法有一个陷阱:
该方法名的三个重载方法实际上都存在返回值(long),他表示了这个文件的物理字节大小。如图:
当然你也可以不返回而直接调用这个方法。但请注意,前面最好加上GridFSDBFile对象不为空的判断,否则程序将有可能抛出异常。

4.GridFS的remove方法,意味着从mongodb中删除某个文件,返回值为void。这也正是让我警惕的地方。如果因为传参错误,remove方法接受了不正确的value或者空串,从而导致删除失败。想象一下,如果一张本该删除的图片却出现在首页上,但程序却没有给你哪怕一点儿提示!

ps:因为32位机器有2G的data size的限制,所以玩玩就行了。不过真正的服务器是不会有这个限制的,并且配合Nginx存取速度也十分理想,网上也已经有类似的测试结果。对于同类产品来,mongo的性能还是比较高的(虽然是以牺牲磁盘空间作为前提),而且也支持类似mysql的master-master replic双机热备份。缺点是,对于原子性的生产环境仍然不如传统的关系型数据库,这点很无奈。同时mongo也不支持事务。

总的来说,mongodb还是很不错的。也许未来几年,关系型数据库和NoSQL还会长期的并存下去。但谁又能说的准呢,就让我们拭目以待吧。
  • 大小: 126.7 KB
  • 大小: 183.1 KB
分享到:
评论
2 楼 GreenLife 2011-08-27  
dadadada2x 写道
我想给gridfs文件非空验证
validates_presence_of :result_file, :message => "不能为空。"
出现
Could not open file matching {"_id"=>BSON::ObjectId('4e53422d64de3709dc000002')} {}
错误请问一下这是怎么回事


不知道你是指存进去,还是取出来的时候,看错误信息似乎是id不匹配造成的。
如果存进去的话,可以使用File类的exists()判断;取文件的话,楼主已经提到了,可以用dbFile != null进行判断
1 楼 dadadada2x 2011-08-23  
我想给gridfs文件非空验证
validates_presence_of :result_file, :message => "不能为空。"
出现
Could not open file matching {"_id"=>BSON::ObjectId('4e53422d64de3709dc000002')} {}
错误请问一下这是怎么回事

相关推荐

    Mongodb基于GridFS存储文件

    Mongodb基于GridFS存储文件,通过流的方式存储文件图片,以及读取功能。本人亲自测试、编写。值得信赖

    MongoDB的GridFS:存储大文件的解决方案.rar

    使用GridFS的实战案例 文件上传与下载的Web应用 视频流媒体服务器 GridFS的性能优化 调整分片大小 使用索引优化查询 并发操作优化 GridFS简介 什么是GridFS GridFS的工作原理 GridFS的应用场景 安装与配置 安装...

    Mongodb + GridFS +Java 操作Mongodb中存储的文件

    GridFS 是 MongoDB 提供的一种用于存储和检索大型文件的标准规范,它将大文件分割成多个小块(chunks)存储,方便高效管理和检索。在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件...

    mongodb+GridFS文件的上传下载删除DEMO

    - 删除文件使用 GridFSDBFile 的 `delete()` 方法: ```java GridFSDBFile fileToDelete = gridFS.findOne(fileName); if (fileToDelete != null) { fileToDelete.delete(); } ``` 9. **错误处理和资源关闭*...

    MongoDB数据库GRIDFS上传下载删除文件

    在MongoDB中,GRIDFS是一种特殊的数据存储方式,用于存储和检索大文件,如图片、视频或大型文档。它将文件分割成多个块(chunks),以便更高效地存储和检索。 1. **上传文件到MongoDB的GRIDFS** 在MongoDB中,使用...

    Mongodb的gridfs的C#的例子

    MongoDB的GridFS是一种用于存储和检索大文件的系统,它是MongoDB数据库的一部分,特别适合存储超过16MB的单个文档。在C#中,我们可以利用MongoDB .NET驱动程序来操作GridFS。以下是对GridFS在C#中使用的详细讲解。 ...

    MongoDB-GridFS-test:从MongoDB GridFS下载文件的性能测试

    但是,由于它将文件存储在ASCII字符串块中,因此毫无疑问会降低性能。 我正在尝试从GridFS读取3种不同的部署(不同的MongoDB驱动程序)。 并将结果与​​经典的Nginx配置进行比较。贡献者( ) ( )构型1,Nginx ...

    mongodb gridfs .NET(C#) 文件存储实例

    功能:基于mongodb gridfs实现简单文件上传、下载、搜索、删除。 开发环境:VS2012 mongodb驱动:官方Driver 上传控件:jquery uploadify 疑问:sort()方法可能有点问题 PS:有问题可以留言,欢迎交流~

    Vue+axios+Spring Boot+mongoDB 基于Mongo图片存储和基于GridFS的文件存储.zip

    这个压缩包"Vue+axios+Spring Boot+mongoDB 基于Mongo图片存储和基于GridFS的文件存储.zip"提供了一个完整的解决方案,结合了前端Vue.js框架、axios库、后端Spring Boot微服务以及MongoDB数据库的GridFS文件系统,...

    Mongodb GridFS图片文件存储解决方案

    GridFS 是 MongoDB 提供的一种用于存储和检索大文件的标准方法,如图片、视频或大型文档。在本文中,我们将深入探讨 GridFS 图片文件存储解决方案及其工作原理。 **GridFS 概述** GridFS 是 MongoDB 的一部分,它将...

    PHP MongoDB GridFS 存储文件的方法详解

    以下是对PHP MongoDB GridFS存储文件方法的详细解释: 1. 直接存储文件: ```php $id = $grid-&gt;storeFile("./logo.png"); ``` 在这个例子中,`storeFile()`函数用于将本地文件"logo.png"上传到GridFS。它会自动读取...

    Mongodb批量删除gridfs文件实例

    GridFS 是 MongoDB 内置的一个文件系统,用于存储和检索大文件,如图片、视频等。当你的应用不再需要某些文件,例如大量的图片,进行批量删除可以回收宝贵的存储空间。下面将详细介绍如何在 MongoDB 中批量删除 ...

    springboot 操作mongdb(包含GridFs存储文件) #资源达人分享计划#

    在本教程中,我们将深入探讨如何使用Spring Boot与MongoDB集成,特别关注使用GridFS进行文件存储。Spring Boot简化了Java应用的初始化和配置,而MongoDB作为一个文档型数据库,提供了非关系数据的灵活存储。GridFS是...

    PHP操作MongoDB GridFS 存储文件的详解

    MongoDB GridFS是一个用于在MongoDB数据库中存储大型二进制文件的机制,它将大文件分割成多个小文件块,然后分别存储这些文件块及其元...希望这些知识点对于需要使用PHP操作MongoDB GridFS存储文件的朋友们有所帮助。

    使用java上传MP4文件至mongodb数据库,并下载 源代码

    MongoDB中的GridFS是用于存储大文件的标准,它将文件拆分为多个小块(chunks),便于高效存储和检索。GridFS分为两个集合:`files`用于存储文件元数据,`chunks`用于存储文件内容。 上传MP4文件到GridFS,首先创建...

    MongoDB学习笔记之GridFS使用介绍

    MongoDB的GridFS是一个强大的文件存储系统,专为在数据库中存储和检索大量小文件而设计。GridFS将文件拆分为多个数据块(chunk),每个块都有自己的文档存储在`fs.chunks`集合中,而文件元信息则保存在`fs.files`集合...

    mongdb+GridFS文件上传

    GridFS是MongoDB提供的一种用于存储和检索大型文件(如图片、视频等)的标准规范。在MongoDB中,单个文档的最大大小通常为16MB,但通过GridFS,可以将大文件分割成多个小块进行存储,方便管理和检索。 GridFS主要由...

    MongoDB GridFS.pdf

    MongoDB GridFS 是一种在 MongoDB 数据库中存储和检索大型文件(如图片、音频、视频等)的机制。由于 MongoDB 的 BSON 文档格式对单个文档的大小有限制(默认为 16MB),GridFS 提供了一种解决方案,它将大文件分割...

    Laravel开发-laravel-gridfs-storage

    在本文中,我们将深入探讨Laravel开发中的一个特殊组件——`laravel-gridfs-storage`,这是一个将MongoDB的GridFS存储系统与Laravel框架的存储API整合的工具。MongoDB GridFS是一种分布式文件存储系统,它允许我们以...

Global site tag (gtag.js) - Google Analytics