ESFramework Demo -- 简单的网络硬盘Demo(附源码)

      FTP服务器最核心的功能就是提供文件的上传、下载服务。在ESFramework Demo -- 文件传送Demo(附源码)一文中,我们演示了如何在客户端与客户端之间相互传送文件,现在我们就实现一个简单的FTP服务器,以演示如何在客户端与服务器之间传送文件。在阅读本文之前,请务必先掌握ESFramework 开发手册(03) -- 文件(夹)传送 一文中介绍的文件传送的流程及相关的API的用法。

 本Demo主要演示以下功能:

(1)客户端浏览服务器默认目录下的所有文件。

(2)客户端上传文件到服务器的默认目录下。

(3)客户端可以下载服务器默认目录下任何一个文件。

一.定义信息类型

      根据上面提到的功能需求,我们需要定义相应的信息类型:

    public static class FtpInformationTypes
    {
        /// <summary>
        /// 获取所有文件名。C->S
        /// </summary>
        public const int GetAllFileNames = 0;

        /// <summary>
        /// 请求下载文件。C->S
        /// </summary>
        public const int DownloadFile = 1;        
    }

    上传文件就不用定义额外的信息类型了,可以直接使用IFileOutter的请求发送文件方法就可以了。

二.服务端 

      服务端将文件目录设定在运行目录下的"FileFold"文件夹,所有上传的文件都将被保存到这个目录,所有要下载的文件也来自这个目录。

      服务端的CustomizeHandler类实现了自定义信息处理器接口ICustomizeHandler,当收到来自客户端的FtpInformationTypes.GetAllFileNames同步调用时,就将FileFold目录下的所有文件列表返回给客户端。当收到请求下载文件的信息时,就调用IFileController.BeginSendFile方法将指定的文件发给客户端。

      当客户端要上传文件时,会直接调用IFileOutter的BeginSendFile,此时,服务端将触发IFileController的FileRequestReceived事件。所以,服务端需要预定并处理这个事件: 

    void fileController_FileRequestReceived(string fileID, string senderID, string fileName, ulong fileLength, ESPlus.FileTransceiver.ResumedProjectItem resumedProjectItem, string comment)
    {
            int index = fileName.LastIndexOf('\\');
            string filePath = string.Format(@"{0}FileFold\{1}", AppDomain.CurrentDomain.BaseDirectory, fileName.Substring(index +1));
            this.fileController.BeginReceiveFile(fileID, filePath);
    }

      服务端将保存文件的路径设定在FileFold目录下,然后调用IFileController.BeginReceiveFile方法开始接收文件。当然,这里的处理做了很多简化,比如没有判断磁盘空间是否足够、是否有同名文件等等。

三.客户端

      客户端登录成功后,进入主界面。主界面初始化时,将向服务器发送FtpInformationTypes.GetAllFileNames同步调用,然后将返回的文件列表显示在ListView中。 

      双击ListView中的某个文件时,就向服务器发送FtpInformationTypes.DownloadFile信息。就像上面描述的一样,服务端就会调用IFileController.BeginSendFile方法发送指定的文件,然后,客户端也会触发IFileOutter.FileRequestReceived事件,处理这个事件时,我们让用户选择要存储的路径。 

    void fileOutter_FileRequestReceived(string projectID, string senderID, string fileName, ulong totalSize, ResumedProjectItem resumedFileItem, string comment)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new CbReadyToAcceptFileAsyn(this.fileOutter_FileRequestReceived), projectID, senderID, fileName, totalSize, resumedFileItem, comment);
        }
        else
        {
            string savePath = ESBasic.Helpers.FileHelper.GetPathToSave("保存", fileName, null);
            if (string.IsNullOrEmpty(savePath))
            {
                this.fileOutter.RejectFile(projectID);
            }
            else
            {
                this.fileOutter.BeginReceiveFile(projectID, savePath);
            }
        }           
    }

      如果用户取消了保存路径的选择,表示放弃下载文件,这样就调用IFileOutter.RejectFile来进行取消操作。
      当客户端点击上传按钮时,就直接调用IFileOutter.BeginSendFile来准备上传文件。

    private void toolStripButton_upLoad_Click(object sender, EventArgs e)
    {
        string filePath = ESBasic.Helpers.FileHelper.GetFileToOpen("打开");
        if (filePath == null)
        {
            return;
        }
        string fileID;
        SendingFileParas sendingFileParas = new SendingFileParas(2048, 0);//文件数据包大小,可以根据网络状况设定,局网内可以设为204800,传输速度可以达到30M/s以上;公网建议设定为2048或4096或8192
        this.fileOutter.BeginSendFile(NetServer.SystemUserID, filePath, null, sendingFileParas, out fileID);
    } 

      这将引发服务端IFileController的FileRequestReceived事件触发,然后,服务端会调用IFileController.BeginReceiveFile方法,从而启动文件的正式传递。

      下图是客户端正在进行上传下载文件时的截图:       

     

       本文是一个最简单的演示文件上传下载功能的demo,非常的粗糙,仅仅用于示范如何使用ESPlus提供的文件传送功能在服务端和客户端之间传递文件。若要正式开发一个文件服务器系统,本文只能算是一个简陋的起点,还有很多复杂的事情要做,那已经超出了本文的内容,但你若有任何想法,欢迎与我们讨论。

四.源码下载 

(1)ESFramework.Demos.Ftp 源码

(2)ESFramework.Boosts 源码:ESFramework 增强库,里面有网盘(NetworkDisk)完整版的标准可复用实现。

----------------------------------------------------------------------------------------------------------------------------------------------- 

 下载免费版本的ESFramework 以及 demo源码  

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

傲瑞实用组件

SDK下载

NPush 消息推送组件

StriveEngine 轻量级的通信引擎

MFile 语音视频录制组件

MCapture 语音视频采集组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

傲瑞组件 FAQ

授权

授权流程

产品授权说明

产品选购指南

授权SDK使用说明

其它

SDK使用技巧

联系我们

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com