Discuz!NT中远程附件的功能实现[FTP协议]

文/代震军  出处/博客园

      大约在去年的12月份,我们开始着手设计和开发这项功能,而该项功能主要是解决类似于一些帖子附件(图片或文件)访问比较频繁,同时附件的体积又比较大,从而造成对主站服务器访问压力过大的问题。而实现了该项功能之后,在一些合作伙伴的站点上使用了一段时间,发现该功能明显的降低了主站服务器的负载,使其可以节省更多的资源(cpu,内存等) 用于处理用户的其它访问请求。


    下面就简要介绍一下该功能的一些实现细节, 该项功能所实现的流程如下图所示:


 附件: 您所在的用户组无法下载或查看附件



   
    而主要的核心就是采用FTP协议上传附件到远程的服务器上,这样当用户点开网页或进行附件下载时,就会将链接指向远程的FTP服务上(该服务器要支持HTTP协议访问其资源)。而这个类的原型链接如下:

    http://www.csharphelp.com/archives/archive9.html
 

    本人在其基础上修改了该类在DEBUG模式下上传文件过程中的BUG,同时翻译了其注释内容。大家可在dicuz.common.dll(discuz!nt 2.1以后的版块)的中找到该类(使用Reflector)。

    下面是其核心代码(您可在下个开源版本中获取该类的全部代码):

Code


有了核心代码,下面就是相关的FTP信息(如服务器站点,端口号,密码等)是如何在我们产品代

码中进行设置并保存呢?

    请用Reflectort工具反射文件:discuz.config.dll,其配置类如下(其也采用序列化方式进行保

存):


    FTPConfigInfo  [FTP配置信息类]
    FTPConfigInfoCollection [FTP配置信息类集合]

    其中的FTPConfigInfo类的代码如下(我已将注释补充):

Code


而上面的FTPConfigInfoCollection类是一个可序列化的集合类(为FTPConfigInfo类实例集合)。
这样做是因为如果当论坛,空间,相册等功能需要远程附件支持时,都需要各自的配置信息,而通过序列
化FTPConfigInfoCollection 便可获取或保存各个功能的相应配置信息(也便于日后扩展),其生成的序
列化信息格式如下(相应的节点信息对应上面的FTPConfigInfo类的属性字段):

Code


而该序列化配置文件位于discuz.web项目的config\ftp.config下。


    当然上面所说的只是相应的配置类,而为了便于前台开发相应功能,我对上面所说的FTP和配置类又进行了一次

类封装,并将类命名为FTPs,放在了discuz.forum下,大家可以用Reflector获得其代码,我在这里将注释补充如下:

Code