FastDFS客戶端可以幫助我們很方便的連接DFS服務器,將封裝好的SOCKET命令發送到服務器端,DFS只提供linux環境下的服務器端,暫不支持WINDOWS系統,我們做.net開始,可以選擇C#版的FastDFS客戶端,自己可以根據自己的需要再去完善它。
我的改造:
為了調用方便,我把與tracker連接的工作放到了DFS客戶端上,並且為它分配默認的組
public class FastDFSClient { #region Constructors static List<IPEndPoint> trackerIPs = new List<IPEndPoint>(); static IPEndPoint endPoint; public static StorageNode DefaultGroup; /// <summary> /// 當前默認的組,節,卷名稱 /// 開發人員可以通過FastDFSClient.GetStorageNode("groupname")去指定自己的組 /// </summary> static FastDFSClient() { trackerIPs = new List<IPEndPoint>(); endPoint = new IPEndPoint( IPAddress.Parse(FastDFSManager.Instance.Host), FastDFSManager.Instance.Port); trackerIPs.Add(endPoint); ConnectionManager.Initialize(trackerIPs); DefaultGroup = FastDFSClient.GetStorageNode(FastDFSManager.Instance.GroupName); } #endregion
對於開始人員來說,在調用時,可以這樣完成上傳,下載等操作,看代碼:
/* FastDFS Test */ //===========================UploadFile===================================== byte[] content = null; FileStream streamUpload = new FileStream(@"c:\resource\video.mp4", FileMode.Open); using (BinaryReader reader = new BinaryReader(streamUpload)) { content = reader.ReadBytes((int)streamUpload.Length); } string fileName = FastDFSClient.UploadFile(FastDFSClient.DefaultGroup, content, "doc"); Console.ReadKey();
下面我把FastDFSClient類的源代碼公開一下,大家看了后有問題,再提出來,大家再一起解決。
namespace FastDFS.Client { /// <summary> /// FastDFS客戶端 /// </summary> public class FastDFSClient { #region Constructors static List<IPEndPoint> trackerIPs = new List<IPEndPoint>(); static IPEndPoint endPoint; public static StorageNode DefaultGroup; /// <summary> /// 當前默認的組,節,卷名稱 /// 開發人員可以通過FastDFSClient.GetStorageNode("groupname")去指定自己的組 /// </summary> static FastDFSClient() { trackerIPs = new List<IPEndPoint>(); endPoint = new IPEndPoint( IPAddress.Parse(FastDFSManager.Instance.Host), FastDFSManager.Instance.Port); trackerIPs.Add(endPoint); ConnectionManager.Initialize(trackerIPs); DefaultGroup = FastDFSClient.GetStorageNode(FastDFSManager.Instance.GroupName); } #endregion /// <summary> /// 獲取存儲節點 /// </summary> /// <param name="groupName">組名</param> /// <returns>存儲節點實體類</returns> public static StorageNode GetStorageNode(string groupName) { FDFSRequest trackerRequest = QUERY_STORE_WITH_GROUP_ONE.Instance.GetRequest(groupName); QUERY_STORE_WITH_GROUP_ONE.Response trackerResponse = new QUERY_STORE_WITH_GROUP_ONE.Response(trackerRequest.GetResponse()); IPEndPoint storeEndPoint = new IPEndPoint(IPAddress.Parse(trackerResponse.IPStr), trackerResponse.Port); StorageNode result = new StorageNode(); result.GroupName = trackerResponse.GroupName; result.EndPoint = storeEndPoint; result.StorePathIndex = trackerResponse.StorePathIndex; return result; } /// <summary> /// 上傳文件 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="contentByte">文件內容</param> /// <param name="fileExt">文件擴展名(注意:不包含".")</param> /// <returns>文件名</returns> public static string UploadFile(StorageNode storageNode, byte[] contentByte, string fileExt) { FDFSRequest storageReqeust = UPLOAD_FILE.Instance.GetRequest(storageNode.EndPoint, storageNode.StorePathIndex, contentByte.Length, fileExt, contentByte); UPLOAD_FILE.Response storageResponse = new UPLOAD_FILE.Response(storageReqeust.GetResponse()); return storageResponse.FileName; } /// <summary> /// 上傳從文件 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="contentByte">文件內容</param> /// <param name="master_filename">主文件名</param> /// <param name="prefix_name">從文件后綴</param> /// <param name="fileExt">文件擴展名(注意:不包含".")</param> /// <returns>文件名</returns> public static string UploadSlaveFile(string groupName, byte[] contentByte, string master_filename, string prefix_name, string fileExt) { FDFSRequest trackerRequest = QUERY_UPDATE.Instance.GetRequest(groupName, master_filename); QUERY_UPDATE.Response trackerResponse = new QUERY_UPDATE.Response(trackerRequest.GetResponse()); IPEndPoint storeEndPoint = new IPEndPoint(IPAddress.Parse(trackerResponse.IPStr), trackerResponse.Port); FDFSRequest storageReqeust = UPLOAD_SLAVE_FILE.Instance.GetRequest(storeEndPoint, contentByte.Length, master_filename, prefix_name, fileExt, contentByte); UPLOAD_FILE.Response storageResponse = new UPLOAD_FILE.Response(storageReqeust.GetResponse()); return storageResponse.FileName; } /// <summary> /// 上傳可以Append的文件 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="contentByte">文件內容</param> /// <param name="fileExt">文件擴展名(注意:不包含".")</param> /// <returns>文件名</returns> public static string UploadAppenderFile(StorageNode storageNode, byte[] contentByte, string fileExt) { FDFSRequest storageReqeust = UPLOAD_APPEND_FILE.Instance.GetRequest(storageNode.EndPoint, storageNode.StorePathIndex, contentByte.Length, fileExt, contentByte); UPLOAD_APPEND_FILE.Response storageResponse = new UPLOAD_APPEND_FILE.Response(storageReqeust.GetResponse()); return storageResponse.FileName; } /// <summary> /// 附加文件 /// </summary> /// <param name="groupName">組名</param> /// <param name="fileName">文件名</param> /// <param name="contentByte">文件內容</param> public static void AppendFile(string groupName, string fileName, byte[] contentByte) { FDFSRequest trackerRequest = QUERY_UPDATE.Instance.GetRequest(groupName, fileName); QUERY_UPDATE.Response trackerResponse = new QUERY_UPDATE.Response(trackerRequest.GetResponse()); IPEndPoint storeEndPoint = new IPEndPoint(IPAddress.Parse(trackerResponse.IPStr), trackerResponse.Port); FDFSRequest storageReqeust = APPEND_FILE.Instance.GetRequest(storeEndPoint, fileName, contentByte); storageReqeust.GetResponse(); } /// <summary> /// 刪除文件 /// </summary> /// <param name="groupName">組名</param> /// <param name="fileName">文件名</param> public static void RemoveFile(string groupName, string fileName) { FDFSRequest trackerRequest = QUERY_UPDATE.Instance.GetRequest(groupName, fileName); QUERY_UPDATE.Response trackerResponse = new QUERY_UPDATE.Response(trackerRequest.GetResponse()); IPEndPoint storeEndPoint = new IPEndPoint(IPAddress.Parse(trackerResponse.IPStr), trackerResponse.Port); FDFSRequest storageReqeust = DELETE_FILE.Instance.GetRequest(storeEndPoint, groupName, fileName); storageReqeust.GetResponse(); } /// <summary> /// 下載文件 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="fileName">文件名</param> /// <returns>文件內容</returns> public static byte[] DownloadFile(StorageNode storageNode, string fileName) { FDFSRequest storageReqeust = DOWNLOAD_FILE.Instance.GetRequest(storageNode.EndPoint, 0L, 0L, storageNode.GroupName, fileName); DOWNLOAD_FILE.Response storageResponse = new DOWNLOAD_FILE.Response(storageReqeust.GetResponse()); return storageResponse.Content; } /// <summary> /// 增量下載文件 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="fileName">文件名</param> /// <param name="offset">從文件起始點的偏移量</param> /// <param name="length">要讀取的字節數</param> /// <returns>文件內容</returns> public static byte[] DownloadFile(StorageNode storageNode, string fileName, long offset, long length) { FDFSRequest storageReqeust = DOWNLOAD_FILE.Instance.GetRequest(storageNode.EndPoint, offset, length, storageNode.GroupName, fileName); DOWNLOAD_FILE.Response storageResponse = new DOWNLOAD_FILE.Response(storageReqeust.GetResponse()); return storageResponse.Content; } /// <summary> /// 獲取文件信息 /// </summary> /// <param name="storageNode">GetStorageNode方法返回的存儲節點</param> /// <param name="fileName">文件名</param> /// <returns></returns> public static FDFSFileInfo GetFileInfo(StorageNode storageNode, string fileName) { FDFSRequest storageReqeust = QUERY_FILE_INFO.Instance.GetRequest(storageNode.EndPoint, storageNode.GroupName, fileName); FDFSFileInfo result = new FDFSFileInfo(storageReqeust.GetResponse()); return result; } } }