MongoDB GridFS 存储文件
一、介绍
1、GridFS是MongoDB的一种存储机制,用来存储大型二进制文件。
最适合于不常改变但是经常需要连续访问的大文件。
2、存储原理:将大文件分割为多个比较大的块,将每个块作为独立的文档进行存储,
再用一个文件用于将这些块组织在一起并存储文件的元信息。
同时MongoDB支持二进制存储,所以可以将块存储的开销降到非常低。
3、GridFS中:
块会被存储到专用的集合中,默认使用集合为fs.chunks,其中包含的键有:
- _id 主键
- files_id 块所属文件的元信息
- n 块所在文件中的对应位置
- data 块所包含的二进制数据
每个文件的元信息被保存在一个单独的集合中,默认使用集合为fs.files,除自定义键外,还需包含:
- _id 主键
- length 文件所包含的字节数
- chunkSize 组成文件的每个块的大小,单位为字节,默认值为256KB,可调整
- uploadDate 文件被上传到GridFS的日期
- md5 文件内容的MD5校验值,该值由服务器端测试得到
二、代码(以存储图片为例)
1、连接数据库
(一)数据库没有用户名和密码
public static DB getDB(String url_port, String database, String username, String password){
List<ServerAddress> serverAddList = new ArrayList<>();
ServerAddress serverAddress = new ServerAddress(url_port);
serverAddList.add(serverAddress);
List<MongoCredential> credentialList = new ArrayList<>();
MongoCredential credential = MongoCredential.createCredential(username, database, password.toCharArray());
credentialList.add(credential);
MongoClient mongoClient = new MongoClient(serverAddList,credentialList);
return mongoClient.getDB(database);
}
(二)数据库有用户名和密码
public static DB getDB(String host, int port, String database){
MongoClient mongoClient = new MongoClient(host,port);
DB db = mongoClient.getDB(database);
return db;
}
2、获取GridFS
public static GridFS getGridFS(DB db){
GridFS gridFS = new GridFS(db, "fs");
return gridFS;
}
3、插入图片
插入图片的时候会自动以创建GridFS时指定的名称创建两张表,分别是XX.chunks,XX.files
public static void insertFile(GridFS gridFS){
try{
File file = new File("图片路径");
GridFSInputFile gridFSFile = gridFS.createFile(file);
gridFSFile.save();
System.out.println("插入图片成功");
}catch (Exception e){
e.printStackTrace();
}
}
4、删除图片
public static void deleteFile(GridFS gridFS){
BasicDBObject query = new BasicDBObject();
query.put("filename","b1ff438fc1576b6ff7a20e61f4301e68.jpg");
gridFS.remove(query);
System.out.println("删除成功");
}
5、查找图片
public static void findFile(GridFS gridFS){
try {
String fileName = "b1ff438fc1576b6ff7a20e61f4301e68.jpg";
String path = "C:\\Users\\Desktop\\pitcture\\"+fileName;
BasicDBObject query = new BasicDBObject();
query.put("filename",fileName);
GridFSDBFile gridFSOne = gridFS.findOne(query);
//path必须指定到文件,否则会报错java.io.FileNotFoundException: C:\... (拒绝访问。)
gridFSOne.writeTo(new FileOutputStream(path));
System.out.println("获取图片成功");
} catch (IOException e) {
e.printStackTrace();
}
}
文件元信息
该文件被分成多个小块然后存储在.chunks表中