`

MongoDB GridFS java存取文件

 
阅读更多

GridFS首先会在当前数据库创建两个集合:"fs.files"和"fs.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。分块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么知道它对应的文件二进制数据在哪些块呢?那是因为在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int型)"n",它表明这些块的先后顺序。这两个集合名中的"fs"也是可以通过参数自定义的。

官方文档
http://www.mongodb.org/display/DOCS/GridFS
http://www.mongodb.org/display/DOCS/GridFS+Specification
http://api.mongodb.org/java/2.13/

下面我们用mongo-java-driver来实现文件的读取。

MongoGridFSTest.java

 

package cn.slimsmart.mongodb.demo.crud;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;

public class MongoGridFSTest {
	
	private static MongoClient mongoClient = null;
	private static DB db = null;
	private static GridFS gridFS = null;
 
	private static String dbName = "gridfs";

	public static void main(String[] args) throws UnknownHostException, Exception {
		mongoClient = new MongoClient("192.168.36.61", 23000);
	    db = mongoClient.getDB(dbName);
	    gridFS = new GridFS(db);
	    
	    String file = "src/main/resources/20150315172324.png";
	    if(!new File(file).exists()){
	    	System.out.println("file is not exists.");
	    }
        String fileName = "20150315172324.png";
        //把文件保存到gridfs中,并以文件的md5值为id
        save(new FileInputStream(file), fileName,fileName);
        //据文件名从gridfs中读取到文件
         
        GridFSDBFile gridFSDBFile = getByFileName(fileName);
        if(gridFSDBFile != null){
            System.out.println("filename:" + gridFSDBFile.getFilename());
            System.out.println("md5:" + gridFSDBFile.getMD5());
            System.out.println("length:" + gridFSDBFile.getLength());
            System.out.println("uploadDate:" + gridFSDBFile.getUploadDate());
            System.out.println("--------------------------------------");
            gridFSDBFile.writeTo(new FileOutputStream("src/main/resources/20150315172324_out.png"));
        }else{
            System.out.println("can not get file by name:" + fileName);
        }
	}
	
	/**
     * 用给出的id,保存文件,透明处理已存在的情况
     * id 可以是string,long,int,org.bson.types.ObjectId 类型
     * @param in
     * @param id
     */
    public static void save(InputStream in, Object id,String fileName){
        DBObject query  = new BasicDBObject("_id", id);
        GridFSDBFile gridFSDBFile = gridFS.findOne(query);
        if(gridFSDBFile == null){
        	 GridFSInputFile gridFSInputFile = gridFS.createFile(in);
        	 gridFSInputFile.setId(id);
        	 gridFSInputFile.setFilename(fileName);
        	 //gridFSInputFile.setChunkSize();
        	 //gridFSInputFile.setContentType();
        	 //gridFSInputFile.setMetaData();
             gridFSInputFile.save();
        }
    }
    
    /**
     * 据id返回文件
     * @param id
     * @return
     */
    public static GridFSDBFile getById(Object id){
        DBObject query  = new BasicDBObject("_id", id);
        GridFSDBFile gridFSDBFile = gridFS.findOne(query);
        return gridFSDBFile;
    }
    
    /**
     * 据文件名返回文件,只返回第一个
     * @param fileName
     * @return
     */
    public static GridFSDBFile getByFileName(String fileName){
        DBObject query  = new BasicDBObject("filename", fileName);
        GridFSDBFile gridFSDBFile = gridFS.findOne(query);
        return gridFSDBFile;
    }
}

参考文章:

1.MongoDB结合Spring存储文件(图片、音频等等)

分享到:
评论

相关推荐

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

    在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件的存取。 首先,我们需要在Java项目中引入MongoDB的驱动库。目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中...

    mongodb存取文件、webuploader断点续传,支持秒传,openOffice转pdf实现在线预览

    利用mongodb存储文件,前台使用百度webuploader的文件md5实现断点续传,一次上传,下次秒传,解决文件重复问题,避免数据冗余,文件上传后支持下载, 特定格式支持在线预览,office转pdf后前台新页面显示pdf,相关...

    MongoDB学习笔记(五) MongoDB文件存取操作

    2. 使用GridFS方式存取文件 对于大文件(超过4MB),MongoDB提供了一种名为GridFS的机制。GridFS将大文件拆分成多个块,并在两个集合中存储:`fs.files`记录文件元数据,如文件名、大小、创建日期等;`fs.chunks`则...

    mongoDB java driver api

    MongoDB Java驱动API是用于与MongoDB数据库交互的Java库,它是MongoDB官方提供的一个关键组件,使得Java开发者能够方便地在应用程序中存取数据。MongoDB是一个高性能、开源、无模式的文档型数据库,而Java驱动API则...

    mongodb java driver 2.11

    MongoDB Java Driver 2.11是用于与MongoDB数据库进行交互的Java开发库,它提供了丰富的API,使得Java开发者可以方便地在应用程序中存取和管理MongoDB的数据。MongoDB是一款高性能、分布式、文档型的NoSQL数据库,它...

    FileStorage:使用 Spring 和 GridFs MongoDB 存储文件的简单应用程序

    该驱动程序提供了一个API,使得我们可以通过编写Java代码来操作MongoDB数据库,包括使用GridFS存储和检索文件。 5. **文件上传**:在Spring MVC中,可以使用`MultipartFile`接口处理文件上传。用户提交的文件会被...

    mongodb需要的jar

    6. GridFS:对于大型文件的存储,MongoDB提供了GridFS规范。Java驱动程序实现了这一规范,允许通过MongoDatabase和MongoCollection对象透明地存取大文件。 7. 高级特性:MongoDB Java驱动还支持地理空间查询、索引...

    简单的新闻发布系统, Spring Data + Mongodb 实现, 包含GridFsTemplate文件上传..zip

    前端负责展示新闻和处理用户交互,后端通过RESTful API接收前端的请求,处理业务逻辑,通过Spring Data MongoDB存取数据,并利用GridFsTemplate处理文件上传。 6. **安全与性能**:在实际部署时,还需要考虑安全性...

    MongoDB入门教程

    MongoDB学习笔记(五)讨论了MongoDB的文件存取操作,包括GridFS。GridFS是MongoDB的一个特性,用于存储和检索大文件。读者将学习如何使用GridFS来存储、检索和管理超过16MB的大型文件,以及如何实现文件的版本控制和...

    Morphia和MongoDB学习总结<三>

    4. **网格FS**:MongoDB的GridFS功能允许存储和检索大型文件,如图片和视频。 结合Morphia,开发者可以利用MongoDB的强大功能,同时享受到Java编程的便利。在实际项目中,理解Morphia的工作原理以及如何有效地利用...

    资源前后端分离式分布式微服务架构项目CMS页面静态化讲义+源码+视频

    ##### 2.4 GridFS存取文件测试 - **GridFS简介**:MongoDB的一个文件存储系统,适合存储大文件。 - **操作示例**:演示如何在Java中使用GridFS进行文件的上传和下载。 ##### 2.5 测试模板与GridFS集成 - **测试...

Global site tag (gtag.js) - Google Analytics