《mongodb自帶的分布式文件系統(tǒng)》要點(diǎn):
本文介紹了mongodb自帶的分布式文件系統(tǒng),希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:非關(guān)系型數(shù)據(jù)庫
歡迎參與《mongodb自帶的分布式文件系統(tǒng)》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
mongodb除了能夠存儲大量的數(shù)據(jù)外,還內(nèi)置了一個非常好用的文件系統(tǒng).
基于mongodb集群的優(yōu)勢,GridFS當(dāng)然也是分布式的,而且備份也方便.
當(dāng)用戶把文件上傳到GridFS后,文件會被分割成大小為256KB的塊,并單獨(dú)存放.
好處如下:
1.可以有Replication;
2.可以利用MongoDB的權(quán)限訪問控制;
3.可以利用現(xiàn)成的MongoDB備份方式;
今天主要是學(xué)習(xí)如何使用data這個框架來操作GridFS,首先配置gridFs的模板類
<!-- Mongodb gridFs的模板 -->
<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
<constructor-arg ref="mongoDbFactory" />
<constructor-arg ref="mappingConverter" />
</bean>
/**
* 上傳文件
* @author yinjihuan
* @throws Exception
*/
public static void uploadFile() throws Exception {
File file = new File("/Users/yinjihuan/Downlaods/logo.png");
InputStream content = new FileInputStream(file);
//存儲文件的額外信息,比如用戶ID,后面要查詢某個用戶的所有文件時就可以直接查詢
DBObject metadata = new BasicDBObject("userId", "1001");
GridFSFile gridFSFile = gridFsTemplate.store(content, file.getName(), "image/png", metadata);
String fileId = gridFSFile.getId().toString();
System.out.println(fileId);
}
文件默認(rèn)是上傳到數(shù)據(jù)中的fs.files和fs.chunks中
files是用來存儲文件的信息,文件名,md5,文件大小,還有剛剛的metadata,上傳時間等等數(shù)據(jù),數(shù)據(jù)格式如下:
{
"_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"metadata": {
"user_id": 1001
},
"filename": "file",
"aliases": null,
"chunkSize": NumberLong(261120),
"uploadDate": ISODate("2016-09-08T11:38:24.999Z"),
"length": NumberLong(165253),
"contentType": "image/png",
"md5": "668727a643ddd6df2e98f164d9fc90fd"
}
chunks則是用來存儲文件內(nèi)容的
1.files_id就是文件的ID,也就是files集合中的_id
2.n是文件塊的索引,通常文件會被分割成256KB的塊大小存儲
3.data就是文件的數(shù)據(jù)了
當(dāng)需要訪問文件的時候通過文件ID可以找到文件被分成了多少塊,然后從第一塊按順序開始讀取,返回給用戶.
{
"_id": ObjectId("57c18993d4c6355ffeb6f8ae"),
"files_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"n": 0,
"data": BinData(0, "iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA")
}
{
"_id": ObjectId("57c18993d4c6355ffeb6f8ae"),
"files_id": ObjectId("57c17bb0d4c666b6e53ba795"),
"n": 1,
"data": BinData(1,"iVBORw0KGgDSDDSDDSD5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+Yj5xNvmxT5/sHLl5oDl/Y/NtznsPTPllg9+Gqie+YjoA")
}
/**
* 根據(jù)文件ID查詢文件
* @author yinjihuan
* @param fileId
* @return
* @throws Exception
*/
public static GridFSDBFile getFile(String fileId) throws Exception {
return gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
}
/**
* 根據(jù)文件ID刪除文件
* @author yinjihuan
* @param fileId
* @throws Exception
*/
public static void removeFile(String fileId) throws Exception {
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));
}
如果在Spring mvc中想直接訪問存儲的文件也很簡單,直接通過文件ID查詢該文件,然后直接輸出到response就是了,記得要設(shè)置ContentType,這時就明白為什么存儲的時候要把ContentType存起來了.
/**
* 訪問圖片
* @author yinjihuan
* @param fileId
* @param request
* @param response
*/
@RequestMapping(value = "/image/{fileId}")
@ResponseBody public void getImage(@PathVariable String fileId, HttpServletResponse response) {
try {
GridFSDBFile gridfs = filesService.getFile(fileId);
response.setContentType(gridfs.getContentType());
OutputStream out = response.getOutputStream();
gridfs.writeTo(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
源碼下載:https://github.com/yinjihuan/cxytiandi
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/10205.html