ESFramework体系的目标之一就是帮助快速构建IM与业务相结合的系统,在我们的业务应用中,经常会遇到类似这样的需求:商家或服务商需要提供一些资料(文档、影片宣传资料等)给他的用户,他希望用户能方便地下载这些资料,另外,用户也可以直接上传自己的文件到服务器供商家检阅。这种功能就像我们常用的FTP软件的功能一样,在这里,它通常可以直接集成到企业的业务应用中。
EsfFTP是一个实现了Ftp功能的ESFramework扩展,它支持如下功能:
(1)下载文件
(2)上传文件
(3)删除服务器上的文件
(4)权限控制(Ftp可访问性控制)
客户端通过IFtpOutter接口与服务器进行有关Ftp的交互。
由于Ftp功能主要是文件的上传下载功能,所以IFtpOutter从IGeneralFileOutter接口继承,IGeneralFileOutter接口也被EsfIMCore扩展使用,以用于在用户之间进行P2P的文件传递。
IFtpOutter.GetFtpDirectory()方法用于获取服务器的FTP目录,下图是一个获取FTP目录列表的截图:
调用IFtpOutter.UploadFile()和IFtpOutter.DownloadFile()方法可以进行文件上传和下载。IFtpOutter.RemoveFile()方法用于删除服务器上的文件。
这些方法都返回FtpAccessResult枚举值:
[EnumDescription("进行ftp操作的结果")]
public enum FtpAccessResult
{
[EnumDescription("OK")]
OK ,
[EnumDescription("没有权限")]
NoPermission ,
[EnumDescription("下载的目标文件不存在")]
FileNotExist , //For Download
[EnumDescription("上传的文件已经存在")]
FileHasExisted //For Upload
}
这个结果是由服务端返回的,如果是删除文件,则服务端在返回FtpAccessResult.OK之前就已经成功删除了文件。如果是上传或下载文件,则在返回FtpAccessResult.OK之前就已经开始文件传输了。
下图是进行文件下载和上传的截图:
IFtpOutter扩展在实现的过程中,解决了几个小问题:
(1)如果多个用户同时下载同一个文件,这时服务端打开文件的方式必须是以“共享、读”的方式打开,否则,将无法对文件进行并行访问。像下面这样以“共享、读”的方式打开文件:
FileStream fs = new FileStream(filePath, FileMode.Open ,FileAccess.Read ,FileShare.Read);
(2)效率!当有很多用户在下载上传文件时,如何保证服务器的效率。
文件传递非常影响服务器的效率,起主要决定作用的是两个因素,一是每个文件包(FilePackage)的大小,而是两个文件包之间的发送间隔时间的大小。我曾试过,如果间隔时间为0ms,那么当仅仅几个用户下载文件时,服务端的Cpu利用率就是90%-100%。当我把间隔时间设为20ms,同等情况下服务器Cpu利用率为3%-5%,这就正常了。同样FilePackage的大小取值,是1k?还是100k?对效率的影响都是非常大的。至于间隔时间和FilePackage的大小取值到底为多少,需要根据我们的应用环境和网络环境来决定。EsfFTP提供的默认值是:时间间隔为20ms,FilePackage大小为10k。
在ESFramework V1.0 高级演示(0915)中,提供了FTP演示功能,需要试用的朋友可以从ESFramework体系 (序) “下载”部分下载用用看。
下载解压后,打开ApplicationServerSystem文件夹(服务端程序)下的ApplicationServerSystem.exe.config文件,找到"ftpManager"的配置,将FtpDirectoryPath属性的值修改为你要开放的Ftp目录,然后运行即可。