FastDFS

學習主題: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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章