2024年5月26日发(作者:)

在Delphi中利用IdFTP组件实现大文件上传

代正军

提要:本文利用Delphi和Indy套件中的IdFTP组件,在Delphi下生

成ActiveX控件供浏览器客户端上传文件用,上传完毕后客户端发送

消息给服务器端,利用服务器端的脚本处理上传后的文件。

This article will illustrate how to use the IdFTP components in the Delphi

and Indy Suite to generate ActiveX controls for the browser client to

upload files on the platform of Delphi. After the uploading, the client side

will send messages to the server side and process the files using the script

of the server side.

关键词:Delphi,IdFtp,ActiveX,大文件上传,

背景:在开发资源管理平台的项目中,最核心的问题就是处理文件上

传。对于一般的小文件,比如4M以下的文件,可以利用现成的HTML

控件可以顺利的解决问题,并且也有比较好的效率。一个相对完整的

资源管理平台不仅要解决小文件的上传还应对几百兆甚至千兆的文

件提供良好的支持。在现有的技术中,对大文件的上传一直

没有比较好的现成的解决方案。

目前,基于对大文件的解决方案主要有以下两种:

第一种方案:修改文件。在配置文件中跟上

传文件有直接相关的有两个参数,一个是maxRequestLength:指示

支持的最大文件上载大小。 该限制可用于防止因用户将大

量文件传递到该服务器而导致的拒绝服务攻击。 指定的大小以 KB

为单位。 默认值为 4096 KB (4 MB);另一个是 executionTimeout :

指示在被 自动关闭前,允许执行请求的最大秒数。 单位

为秒,在上传大的文件时把这个设的大一些。 这种方案最简单,但

IIS服务器接收文件时会把所有接收到的数据保存在内存里,等全部

数据上传完毕后才写到磁盘上,如果用户上传一个2G的文件,就必

须有大于2G的内存空间,如果再考虑到同时有多个用户上传大的文

件,这种解决方案显然难以满足要求。同时还没有考虑到慢速网络上

传文件的问题,在一个慢速网上上传大文件通常要很长时间,虽然这

是极少数的特殊情况,作为一个健全的系统仍然是我们要考虑的问

题。因此这种解决方案的效果不大,难以满足要求。

第二种方案是无组件上传方案,通常所说的无组件是在浏览器端即客

户端不需要安装任何插件,只使用普通的HTML控件FileUpload来

实现,而在服务器端进行了大量的处理:利用隐含的

HttpWorkerRequest,用它的GetPreloadedEntityBody 和

ReadEntityBody方法从IIS为建立的pipe里分块读取数据,

将处理过的数据即时写入磁盘。这种方案又要比前一种方案好一些,

它解决了服务器端收到大文件后即时写入磁盘,有效利用了硬盘空

间,并且还支持用户多个文件一起上传。基于这种方案的有良好实现

的收费组件,也有网上流传的比较普遍的免费组件。我们也用这种方

案实现了文件的上传,经过测试效果仍然不理想,随着文件尺寸的加

大,处理效率有所下降,虽然解决了部分的内存使用效率问题,但占

用内存依然是可观的,一旦涉及到多用户的并发性,这个方案也无法

圆满解决问题。同时在第一个方案中提出的修改配置文件中的两个参

数在本方案中依然会涉及,不言而喻它固有的缺陷仍然得不到解决。

问题:在处理资源上传的问题上,我们必须要考虑的主要问题有这样

一些:1、应该至少支持几百兆的文件上传,尽可能支持1G以上少

量用户的并发上传;2、应该允许用户一次性多个文件上传;3、应该

支持多个用户同时上传;4、应该支持慢速的网络上传,在上传时间

上应该给与用户相对充裕的时间;5、服务器在收到上传完毕的消息

后,应及时处理掉用户上传的文件:迁移到指定的存储库里和在数据

库中登记相关信息以便于检索。6、容错问题,当然这不是本篇所要

讨论的问题,但为了完整性,我们在也此提出来,当用户选定的文件

没有正确传完,服务器只收到一部分文件的处理。7、用户在下达上

传文件命令时,是在Session的有效时间内下达上传文件的,如果上

传的文件需要很长时间(比如通过一个慢速网,或者上传的文件总量

很大),而此时该Session允许的时间已经结束,服务器如何判别文件

上传完毕及记录相应的信息。等等,需要考虑的问题还有很多,但针

对这些主要的问题,我们设想用FTP技术来解决。

解决方案:

众所周知,基于HTTP的服务主要是用来浏览网页信息的,面对的是

相对小的文本文件和小尺寸图片的处理,对于大文件的处理无论是下

载还是上传都存在或多或少的问题。在前面的分析中也可以看出

HTTP服务没有一个圆满的解决大文件上传的方案。而FTP协议是专

门用于处理文件上传的协议,和HTTP协议一样,也是互联网中应用

非常广泛和成熟的协议,因此我们借助FTP协议来解决资源管理平

台的所涉及到文件上传的问题。在市面上已经有很多的FTP客户端

软件都可以用来上传文件,但由于缺乏针对性,灵活性和本项目的整

合性因而没有办法使用,因此我们利用Delphi及其Indy套件中的

IdFTP客户端控件量身打造上传文件的ActiveX客户端嵌入到我们的

网页中实现文件的上传,尽可能使前面提出的问题得以较好的解决。

下面是本方案的活动图:

在服务器端可以用任何常规的FTP服务器,FTP服务器指定的存储

路径必须让我们的资源管理器能存取到文件即可。

实现细节:略

运行效果图:

后记:本方案相对完满解决资源管理平台的文件上传问题,由于采用

了FTP技术,文件的上传基本上和HTTP服务脱离开来,只需要文

件上传完毕后向HTTP服务器即资源管理平台发送消息即可,资源管

理平台即可调用相应的功能进行后续处理。

参考文献:

1、《Delphi6分布式开发》飞思科技产品研发中心编著,电子工业出版社

2、/WuCountry/archive/2005/12/28/。下大

文件上传的解决方案及WebbUpload组件源码

3、/cn/news/2008/01/handling-large-uploads。在中处理

大文件上传