1.1.什麼是FastDFS?
FastDFS是用c語言編寫的一款開源的分佈式文件系統。FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。
1.2.FastDFS架構
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:管理集羣,tracker也可以實現集羣。每個tracker節點地位平等。
收集Storage集羣的狀態。
Storage:實際保存文件
Storage分爲多個組,每個組之間保存的文件是不同的。每個組內部可以有多個成員,組成員內部保存的內容是一樣的,組成員的地位是一致的,沒有主從的概念。
1.3.使用步驟
第一步:把圖片服務器解壓縮。
第二步:把圖片服務器添加到Vmware中。
第三步:Vmware的網絡配置。
第四步:開機
移動:網絡配置不發生變化。要使用圖片服務器,需要保證網絡配置不變。
複製:重新生成一塊網卡mac地址是新地址。
Ip地址:192.168.25.133
用戶名root、itcast
密碼:itcast
2.圖片服務器使用
2.1.Java客戶端:
Maven環境:
2.2.上傳圖片
2.2.1.上傳步驟
1、加載配置文件,配置文件中的內容就是tracker服務的地址。
配置文件內容:tracker_server=192.168.25.133:22122
2、創建一個TrackerClient對象。直接new一個。
3、使用TrackerClient對象創建連接,獲得一個TrackerServer對象。
4、創建一個StorageServer的引用,值爲null
5、創建一個StorageClient對象,需要兩個參數TrackerServer對象、StorageServer的引用
6、使用StorageClient對象上傳圖片。
7、返回數組。包含組名和圖片的路徑。
2.2.2.代碼
public class FastDFSTest {
@Test
public void testFileUpload() throws Exception {
// 1、加載配置文件,配置文件中的內容就是tracker服務的地址。
ClientGlobal.init("D:/workspaces-itcast/e3-manager-web/src/main/resources/resource/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:/Documents/Pictures/images/200811281555127886.jpg", "jpg", null);
// 7、返回數組。包含組名和圖片的路徑。
for (String string : strings) {
System.out.println(string);
}
}
}
2.3.使用工具類上傳
2.4.Controller
@Controller
public class PictureController {
@Value("${IMAGE_SERVER_URL}")
private String IMAGE_SERVER_URL;
@RequestMapping("/pic/upload")
@ResponseBody
public Map fileUpload(MultipartFile uploadFile) {
try {
//1、取文件的擴展名
String originalFilename = uploadFile.getOriginalFilename();
String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//2、創建一個FastDFS的客戶端
FastDFSClient fastDFSClient = new FastDFSClient("classpath:resource/client.conf");
//3、執行上傳處理
String path = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);
//4、拼接返回的url和ip地址,拼裝成完整的url
String url = IMAGE_SERVER_URL + path;
//5、返回map
Map result = new HashMap<>();
result.put("error", 0);
result.put("url", url);
return result;
} catch (Exception e) {
e.printStackTrace();
//5、返回map
Map result = new HashMap<>();
result.put("error", 1);
result.put("message", "圖片上傳失敗");
return result;
}
}
}
2.5.解決瀏覽器兼容性的問題
KindEditor的圖片上傳插件,對瀏覽器兼容性不好。
使用@ResponseBody註解返回java對象,
Content-Type:application/json;charset=UTF-8
返回字符串時:
Content-Type:text/plan;charset=UTF-8
返回字符串時:
Content-Type:text/plan;charset=UTF-8
指定響應結果的content-type:
KindEditor的多圖片上傳插件最後響應的content-type是text/plan格式的json字符串。兼容性是最好的。