【转】Asp.NET大文件上传组件开发总结(六)---大文件上传组件使用说明
1编写目的
为了方便用户使用大文件上传组件,特写使用说明书,以指明调用组件的接口,操作流程和注意事项。
2背景
由于ASP.NET在上传文件时,是全部装入服务器内存,在上传文件时,消耗服务器资源较多,且不能提供上传进度显示,由于消耗服务器资源较多,所以ASP.NET上传文件时往往大小受到限制。此组件解决了所有这些问题
3定义
大文件:大文件主要意思是指大小不受限制,
Web.config:是ASP.NET的配置文件。
4功能
所有需要用ASP.NET上传文件的地方,均可以使用本组件。本组件可以解除ASP.NET对上传文件大小的限制,同时提供上传进度提示,用户还可以选择中断上传过程。减少对服务器资源的消耗(经测试,服务器资源消耗与运行普通ASP.NET页面相差无几)
5、组件主要类及操作:
5.1 BigFileUploadModuleHandle
大文件上传处理模块,用于在客户端请求发送到服务器上后,分析请求内容,如果是上传文件,则在IIS将数据出发送到ASP.NET的管道中时,读取数据,写入文件,并重新组织请求内容,重新组织的内容是去掉了文件内容的请求内容。页面在接收到请求后,除文件上传控件不能读取文件内容外,其它组件的属性可以正常访问。
5.2 DataReader
请求数据分析和文件写入。
5.3 UpFileInfo
上传文件属性结构,供组件内部使用。
5.4 UploadContext
文件上传环境,组件在使用时,主要使用此类。具体有以下方法和属性:
UploadContext:构造函数,需传入文件上传页面对象和文件临时存放目录。外部不能直接调用些构造函数,要构建文件上传环境,需调用UploadContextFactory的提供的静态方法
TmepFileDir:获取和设置上传临时文件存放路径
FileNames上传的文件名列表
TotalLength发送信息总长度,包括页面所有控件请求内容
Readedlength已接收的信息长度 包括面页控件请求内容
StartReadDateTime开始接收时间
FileConIds页面文件上传控件ID列表,对文件上传控件在服务器端运行时,为控件的UniqueID
GUID:上传文件唯一标志
Abort :设置和读取是否中断上传过程
Ratio上传速率,返回每秒上传的字节数
FormatRatio获取格式化的上传速度,以适当的字节,K字节,M字节表示
LeftTime估计上传剩余时间,以秒为单位
FormatLeftTime获取格式上的上传剩余时间,适当的以小时,分钟,秒表示
CurrentFile当前正在处理的上传文件
Status上传状态
FormatStatus 以字符串格式,返回当前上传操作的状态
SaveFile另存上传的数据文件,此方法主要将文件从临时存放目录移到用户需要求的目录,由于采取移动文件办法,所以此方法调用成功后,临时文件对应文件将被移走。
GetFileNameByControl根据页面文件上传控件名称,获取上传的文件名
Dispose当前上下文环境中接收的所有文件
GetFileName :根据文件上传控件名称,获取对应的上传的文件。
5.5 UploadContextFactory
创建和获取文件上传环境。
InitUploadContext(System.Web.UI.Page page,string TempFileDir)根据页面对象和上传文件临时目录文件夹,获取一个文件上传上下文类实例
GetUploadContext根据页面发送的上传会话编号,获取文件上传上下文
GetUploadContext(string GUID)根据会话编号的GUID获取文件上传的上下文
Release在页面逻辑处理完成后,释放上传上下文,并删除临时文件
uploadStatus:文件上传状态枚举类
6 使用方法及注意事项
1、 将组件dll复制到应用系统bin目录,然后再VS.NET中引用本组件,
2、 在web.config增加ASP.NET处理模块
<httpModules>
<add name="BigFileUploadModuleHandle " type="HelpSoft.BigFileUploadModuleHandle,BigFileUploadHandle" />
</httpModules>
3、 在要上传文件的asp.net页面的页面装入事件中或初始化事件中,初始化文件上传环境,注册文件上传存放的临时文件夹,如下面代码:
private void Page_Load(object sender, System.EventArgs e)
{
UploadContext context = UploadContextFactory.InitUploadContext(this, @"c:" myupload"");
}
提示:A、文件存放目录要求设置相应的访问权限,目录必须存在
B、初始化上传环境后,页面须在一天内发送文件。否则上传环境失效。
C、初始化上传环境时,组件将在页面内注册隐藏域,记录上传会话唯一标志。隐藏域命名为UploadID,页面不能有同名控件。
D、需要上传文件表单编码方式必须为multipart/form-data,(对于文件上传控件作为服务器端控件运行时,系统会自动加入此编码方式,否则需用户手工添加)
E、要使本上传组件生效,必须在页面访问时初始化上传环境,和设置表单编码方式,反之,如不希望本组件对特定页面生效,只可取消前两条件之一。
4、 在文件上传提交事件中,直接从上传文件环境工厂类中获取文件上传环境,进一步获取上传的文件信息。类似代码如下:
UploadContext context = UploadContextFactory.GetUploadContext();
string FileName = context.GetFileNameByControl(resFile.UniqueID);
string filePath=@"c:"workdir";
if (context.SaveFile(resFile.UniqueID,filePath+FileName))
{
UploadContextFactory.Release();
}
提示:A、根据控件名获取对应的上传文件信息时,对服务器控件需要传入控件唯一标志,对非服务器控件,需传入控件名称。
B、对文件另存时的目录访问权限,是否存在、可用空间大小,由页面调用者检查处理。如此类型错误发生,系统将引发对应异常。
C、如没找到控件对应文件(可能是客户端没有指定文件或传的控件标志有误)、临时目录中对应文件也不存在(已成功调用过此方法,文件已被移走),本方法将返回假,操作成功后,方法返回真。
D、UploadContextFactory.Release()将从系统缓存中清除上传环境对象,将不能用GetUploadContext方法获取上传环境,但已取得的上传环境仍然可用。
5、 读取文件上传进度时,需另建一个ASPX页面,读取进度主要是根据上传文件的会话唯一标志,从系统缓存中(通过GetUploadContext(string GUID)方法))获取上传文件环境,访问此环境类,即可以获取文件上传开始时间、信息总长度、当前已传送信息长度、速度、估计剩余时间等信息。系统再使用定时刷新的办法,不断获得上传进度信息,即可形成上传进度提示。
进度显示可以使用XML无回刷新方式,也可以使用页面定时刷新方式。
6、 要在传输过程中,中断传输入过程,只需用会话唯一标志,获取上传环境,将一上传环境的abort属性设为真,系统将主动与客户端断开连接,中断上传过程,同时页面提交的其它数据也将取消。