Loading...
通过Spring Data MongoDB向mongoDB GridFs 存储图片

mongoDB笔记 2016/01/18 Spring Framework , MongoDB

开篇说明

  GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为mongodb的一个文档(document)被存储在chunks集合中..gridfs模块会为每个文件创建chunks和files信息.每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中.files集合中的文档就是BSON格式,可以使用mongodb的索引等等特性。

    对于GridFS文件的web访问方式,大家可以搜索一下Gridfs + nginx,既可获取相应的信息..


具体步骤

1、在applicationContext-mongodb.xml配置文件中添加GridFsTemplate配置:

	<!-- GridFsTemplate -->
	<mongo:mapping-converter id="converter" />
	<bean class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
	    <constructor-arg ref="mongoDbFactory" />
	    <constructor-arg ref="converter" />
	    <constructor-arg value="imethan_sys_fs" /><!-- 指定GridFS Collections名称 -->
	</bean>


2、创建文件存取测试客户端,代码如下:

package cn.imethan.mongodb;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsOperations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSFile;

/**
 * GridFsClient.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2016年1月18日下午3:03:02
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/main/applicationContext.xml", "classpath:/mongodb/applicationContext-mongodb.xml" })
public class GridFsClient {
	
	@Autowired
	private GridFsOperations gridFsOperations;
	
	/**
	 * 保存测试
	 * 
	 * @author Ethan Wong
	 * @datetime 2016年1月18日下午3:51:28
	 */
	@Test
	public void storeFileToGridFs() {
		DBObject metaData = new BasicDBObject();
		metaData.put("extra1", "anything 1");
		metaData.put("extra2", "anything 2");
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream("C:/Users/ETHAN/Pictures/e.png");
			GridFSFile gridFSFile = gridFsOperations.store(inputStream, "e.png", "image/png", metaData);
			System.out.println("gridFSFile:"+gridFSFile.toString());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("Done");
	}
	
	/**
	 * 读取测试
	 * 
	 * @author Ethan Wong
	 * @datetime 2016年1月18日下午3:51:28
	 */
	@Test
	public void findFilesInGridFs() {
		List<GridFSDBFile> result = gridFsOperations.find(new Query().addCriteria(Criteria.where("filename").is("e.png")));
		for (GridFSDBFile file : result) {
			try {
				System.out.println(file.getFilename());
				System.out.println(file.getContentType());
				//save as another image
				file.writeTo("C:/Users/ETHAN/Pictures/e1.png");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println("Done");
	}
}


3、登录mongoDB查看结果

db.getCollection('imethan_sys_file.files').find({})

/* 1 */
{
    "_id" : ObjectId("569c9831c6a346b44944e6e8"),
    "chunkSize" : NumberLong(261120),
    "length" : NumberLong(3327),
    "md5" : "879a908fd59d7419b42d43e389886a0b",
    "filename" : "e.png",
    "contentType" : "image/png",
    "uploadDate" : ISODate("2016-01-18T07:45:53.828Z"),
    "aliases" : null,
    "metadata" : {
        "extra1" : "anything 1",
        "extra2" : "anything 2"
    }
}


db.getCollection('imethan_sys_file.chunks').find({})

/* 1 */
{
    "_id" : ObjectId("569c9831c6a346b44944e6e9"),
    "files_id" : ObjectId("569c9831c6a346b44944e6e8"),
    "n" : 0,
    "data" : { "$binary" : "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", "$type" : "00" }
}


参考文档

http://docs.spring.io/spring-data/data-mongo/docs/1.8.2.RELEASE/reference/html/#gridfs

http://www.mkyong.com/mongodb/spring-data-mongodb-save-binary-file-gridfs-example/



Comments