學習主題:FastDFS
學習目標:
1.掌握FastDFS定義
2.掌握FastDFS的配置
3.掌握FastDFS 術語
4.掌握FastDFS上傳 下載 刪除
5.掌握FastDFS在java端的配置
6.掌握FastDFS與WEB項目的結合
1.FastDFS 是什麼,有什麼作用?
FastDFS 是一個開源的輕量級分佈式文件系統
作用:它對文件進行管理,功能包括:文件存
儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。
特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。
2.FastDFS如何實現數據同步?
同一組內的 storage server 之間是對等的,文件上傳、刪除等操作可以在任意一臺 storage
server 上進行;
文件同步只在同組內的 storage server 之間進行,採用 push 方式,即源服務器同步給目
標服務器;
源頭數據才需要同步,備份數據不需要再次同步,否則就構成環路了;
上述第二條規則有個例外,就是新增加一臺storage server時,由已有的一臺storage server
將已有的所有數據(包括源頭數據和備份數據)同步給該新增服務器
3.Tracker 的啓動 停止命令是什麼?
/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_trackerd status
/etc/init.d/fdfs_trackerd stop
4.Storage的啓動 停止命令是什麼?
/etc/init.d/fdfs_storaged start
/etc/init.d/fdfs_storaged status
/etc/init.d/fdfs_storaged stop
5.在命令行如何實現 上傳 下載 刪除?
上傳:
fdfsFile = storageClient.upload_file(local_filename, file_ext_name, meta_list);
下載:
downFile = storageClient.download_file(groupName, remoteFilename);
刪除:
flag = storageClient.delete_file(groupname, remotefilename);
6.Java端配置FastDFS有幾種方式 分別是什麼?
兩種:fdfs.config
#連接超時,單位秒
connect_timeout=10
#網絡超時,單位秒
network_timeout=30
#字符集設置
charset=UTF-8
#必須和 tracker server 中的/etc/fdfs/tracker.conf 配置文件中的 http.server_port=8080 配置 一致
http.tracker_http_port=8080
#tracker server 的訪問 IP 和 Port。
tracker_server=192.168.92.136:22122
Fdfs.properties
#連接超時, 單位是秒
fastdfs.connect_timeout_in_seconds=10
#網絡超時, 單位是秒
fastdfs.network_timeout_in_seconds=30
#字符集設置
fastdfs.charset=UTF-8
#必須和 tracker server 中的/etc/fdfs/tracker.conf 配置文件中的 http.server_port=8080 配置 一致
fastdfs.http_tracker_http_port=8080
#tracker server 的訪問 IP 和 Port。
fastdfs.tracker_servers=192.168.92.136:22122
7.如何實現網頁下載 請用自己的話 描述一下下載流程?
1.首先先在前臺jsp頁面給定超鏈接用於發送下載文件請求並攜帶文件ID
<a href="/downloadFile/${fileInfo.id}">下載</a>
2.在前端控制器接收前臺的請求和數據,然後向後臺請求數據
/**
* 下載文件
* @param fileInfoId 要下載的文件在數據庫中的相關數據主鍵
*/
@RequestMapping(value="/downloadFile/{fileInfoId}")
public void downloadFile(@PathVariable("fileInfoId") Long fileInfoId, HttpServletResponse response){
// 獲取要傳遞給客戶端的文件數據
InputStream inputStream = null;
try {
inputStream = this.fileService.getFile(fileInfoId);
FileInfo fileInfo = this.fileService.getFileInfoById(fileInfoId);
// 設置響應頭, 響應爲下載,下載的文件名是什麼
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachement;filename="+fileInfo.getFileName());
// 通過輸出流輸出文件內容到客戶端
OutputStream outputStream = response.getOutputStream();
byte[] temp = new byte[512];
int len = 0;
while((len = inputStream.read(temp)) != -1){
outputStream.write(temp, 0, len);
}
// 刷新緩存
outputStream.flush();
}catch(Exception e){
e.printStackTrace();
}finally {
if(inputStream != null){ // 回收資源
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.書寫fastDFS的下載文件方法,用於獲取後臺數據庫的數據
/**
* 下載文件
* @return 要下載的文件的輸入流
*/
public static InputStream download(String groupName, String remoteFileName){
try{
byte[] datas = storageClient.download_file(groupName, remoteFileName);
return new ByteArrayInputStream(datas);
}catch(Exception e){
e.printStackTrace();
return null;
}
}
4.寫service層代碼。通過mapper層獲取數據庫數據
@Override
public InputStream getFile(Long fileInfoId) {
// 訪問數據庫,獲取要下載的文件的詳情信息
FileInfo fileInfo = this.fileInfoMapper.selectById(fileInfoId);
// 訪問FastDFS,獲取要下載的文件的具體內容
InputStream inputStream = FastDFSCommonsUtils.download(fileInfo.getGroupName(), fileInfo.getRemoteFileName());
// 返回
return inputStream;
}
@Override
public FileInfo getFileInfoById(Long fileInfoId) {
return this.fileInfoMapper.selectById(fileInfoId);
}
5.在mapper層寫SQL語句獲取數據
<select id="selectById" resultType="com.bjsxt.entity.FileInfo">
select id, file_name as fileName, group_name as groupName, remote_file_name as remoteFileName,
file_path as filePath
from t_files
where id = #{id}
</select>