1.FastDFS是什么?
FastDFS是分布式文件系統。使用 FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
2.工作原理
FastDFS 架構包括 Tracker server 和 Storage server。客戶端請求 Tracker server 進行文件上傳、下載,通過 Tracker server 調度最終由 Storage server 完成文件上傳和下載。
Tracker server 作用是負載均衡和調度,通過 Tracker server 在文件上傳時可以根據一些策略找到 Storage server 提供文件上傳服務。可以將 tracker 稱為追蹤服務器或調度服務器。
Storage server 作用是文件存儲,客戶端上傳的文件最終存儲在 Storage 服務器上,Storage server 沒有實現自己的文件系統而是利用操作系統的文件系統來管理文件。可以將storage稱為存儲服務器。
每個 tracker 節點地位平等。收集 Storage 集群的狀態。
Storage 分為多個組,每個組之間保存的文件是不同的。每個組內部可以有多個成員,組成員內部保存的內容是一樣的,組成員的地位是一致的,沒有主從的概念。
3.文件的上傳
文件上傳流程:
客戶端上傳文件后存儲服務器將文件 ID 返回給客戶端,此文件 ID 用於以后訪問該文件的索引信息。文件索引信息包括:組名,虛擬磁盤路徑,數據兩級目錄,文件名。
4.文件的下載
文件下載流程:
5.FastDFS安裝
為了能夠快速的搭建FastDFS環境進行代碼開發,我們這里提供了安裝好的鏡像。
雙擊vmx文件,然后啟動。注意:遇到下列提示選擇“我已移動該虛擬機”!
IP地址已經固定為192.168.25.133 ,請設置你的僅主機網段為25。登錄名為root 密碼為root。
6.FastDFS入門小Demo
(1)創建Maven工程fastDFSdemo
由於FastDFS客戶端jar包並沒有在中央倉庫中,所以需要使用下列命令手動安裝jar包到Maven本地倉庫
mvn install:install-file -DgroupId=org.csource.fastdfs -DartifactId=fastdfs -Dversion=1.2 -Dpackaging=jar -Dfile=d:\setup\fastdfs_client_v1.20.jar
(2)pom.xml引入
<!-- 文件上傳組件 --> <dependency> <groupId>org.csource.fastdfs</groupId> <artifactId>fastdfs</artifactId>
</dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency>
(3)添加配置文件fdfs_client.conf ,將其中的服務器地址設置為192.168.25.133
# connect timeout in seconds # default value is 30s connect_timeout=30 # network timeout in seconds # default value is 30s network_timeout=60 # the base path to store log files base_path=/home/fastdfs # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=192.168.25.133:22122 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # if use connection pool # default value is false # since V4.05 use_connection_pool = false # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server # since V4.05 # default value is false load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # default value is false # since V4.05 use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 #use "#include" directive to include HTTP other settiongs ##include http.conf
(4)創建java類,main方法代碼如下
// 1、加載配置文件,配置文件中的內容就是 tracker 服務的地址。 ClientGlobal.init("D:/maven_work/fastDFS-demo/src/fdfs_client.conf"); // 2、創建一個 TrackerClient 對象。直接 new 一個。 TrackerClient trackerClient = new TrackerClient(); // 3、使用 TrackerClient 對象創建連接,獲得一個 TrackerServer 對象。 TrackerServer trackerServer = trackerClient.getConnection(); // 4、創建一個 StorageServer 的引用,值為 null StorageServer storageServer = null; // 5、創建一個 StorageClient 對象,需要兩個參數 TrackerServer 對象、StorageServer 的引用 StorageClient storageClient = new StorageClient(trackerServer, storageServer); // 6、使用 StorageClient 對象上傳圖片。 //擴展名不帶“.” String[] strings = storageClient.upload_file("D:/pic/benchi.jpg", "jpg", null); // 7、返回數組。包含組名和圖片的路徑。 for (String string : strings) { System.out.println(string); }
控制台輸出如下結果
group1 M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg
在瀏覽器輸入http://192.168.25.133/group1/M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg即可訪問這張圖片。
注意,在那個類中,第1步的配置文件路徑需要使用文件的絕對路徑,第6步的文件路徑也是一樣。
7.項目的整合
1)把fdfs_client.conf 拷貝到工程的config文件夾中。
2)在springmvc.xml中添加
<!-- 配置多媒體解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"></property> <!-- 設定文件上傳的最大值5MB,5*1024*1024 --> <property name="maxUploadSize" value="5242880"></property> </bean>
3)新建application.properties文件,添加配置
FILE_SERVER_URL=http://192.168.25.133/
4)在控制層新建UploadController.java。這里用到了FastDFSClient的類,所以要把這個工具類復制到項目中:
package com.huanletao.shop.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import entity.Result; import util.FastDFSClient; /** * 文件上傳Controller * @author Administrator * */ @RestController public class UploadController { @Value("${FILE_SERVER_URL}") private String FILE_SERVER_URL;//文件服務器地址 @RequestMapping("/upload") public Result upload( MultipartFile file){ //1、取文件的擴展名 String originalFilename = file.getOriginalFilename(); String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); try { //2、創建一個 FastDFS 的客戶端 FastDFSClient fastDFSClient = new FastDFSClient("classpath:config/fdfs_client.conf"); //3、執行上傳處理 String path = fastDFSClient.uploadFile(file.getBytes(), extName); //4、拼接返回的 url 和 ip 地址,拼裝成完整的 url String url = FILE_SERVER_URL + path; return new Result(true,url); } catch (Exception e) { e.printStackTrace(); return new Result(false, "上傳失敗"); } } }
5)在工程的創建uploadService.js
//文件上傳服務層 app.service("uploadService",function($http){ this.uploadFile=function(){ var formData=new FormData(); formData.append("file",file.files[0]); return $http({ method:'POST', url:"../upload.do", data: formData, headers: {'Content-Type':undefined}, transformRequest: angular.identity }); } });