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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:品味FastDFS~第二回 FastDFS客户端的使用,如需转载请自行联系原博主。

目录
相关文章
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
237 1
|
10月前
|
前端开发 数据安全/隐私保护 开发者
FirstUI:Deepseek能帮我们做很多事情,而这款开源框架专为开发者设计的开源UI框架,让你的项目加速起飞
嗨,大家好,我是小华同学。今天为大家介绍一个轻量级、响应式的前端UI框架——FirstUI。它提供丰富的组件库,包括按钮、输入框、下拉菜单等,帮助开发者快速构建美观、功能丰富的用户界面。FirstUI的核心理念是“简单、快速、高效”,适合各种Web应用开发,如企业网站、电商平台和个人博客。其体积小、加载快,支持响应式设计,并且易于定制。FirstUI拥有活跃的社区支持,开发者可以轻松找到帮助并分享经验。欢迎关注我们,获取更多优质开源项目和高效工作学习方法。
406 0
|
7月前
|
编解码 人工智能 API
飞桨x昇腾生态适配方案:12_动态OM推理
本文介绍了基于Ascend AI平台的OM模型动态推理方法,包括动态BatchSize、动态分辨率、动态维度及动态Shape四种场景,支持固定模式与自动设置模式。通过`ais_bench`工具实现推理,提供示例命令及输出结果说明,并解决常见问题(如环境变量未设置、输入与模型不匹配等)。此外,还提供了API推理指南及参考链接,帮助用户深入了解ONNX离线推理流程、性能优化案例及工具使用方法。
469 0
|
监控 开发工具
Zabbix自定义KEY报错ZBX_NOTSUPPORTED: Unsupported item key.
[root@zabbix bin]# ./zabbix_get -s 192.217.24.47 -k jump-server ZBX_NOTSUPPORTED: Unsupported item key.
10304 1
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
982 0
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
|
Ubuntu Unix
Ubuntu开启NTP时间同步
Ubuntu开启NTP时间同步
18928 0
|
Java
全网最全Java快捷键~
全网最全Java快捷键~
392 0
|
JavaScript 前端开发
01EasyUI - EasyUI简介
01EasyUI - EasyUI简介
251 0
|
安全 Linux 调度
操作系统:Linux vs Windows内核与应用对比(二)
操作系统:Linux vs Windows内核与应用对比
481 0

热门文章

最新文章