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";
-
- save(new FileInputStream(file), fileName,fileName);
-
-
- 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);
- }
- }
-
-
-
-
-
-
-
- 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.save();
- }
- }
-
-
-
-
-
-
- public static GridFSDBFile getById(Object id){
- DBObject query = new BasicDBObject("_id", id);
- GridFSDBFile gridFSDBFile = gridFS.findOne(query);
- return gridFSDBFile;
- }
-
-
-
-
-
-
- public static GridFSDBFile getByFileName(String fileName){
- DBObject query = new BasicDBObject("filename", fileName);
- GridFSDBFile gridFSDBFile = gridFS.findOne(query);
- return gridFSDBFile;
- }
- }
参考文章:
1.MongoDB结合Spring存储文件(图片、音频等等)
http://blog.csdn.net/zhu_tianwei/article/details/44278455