品味FastDFS~第二回 FastDFS客戶端的使用


回到目錄

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;
        }
    }
}

 

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM