基于ASP.NET 的大文件上传模块研究与实现

2015-06-02 12:30赵学孔龙世荣
电脑知识与技术 2015年9期

赵学孔 龙世荣

摘要:ASP.NET作为当前开发动态Web程序的主流技术备受系统开发者的青睐,但其内置的FileUpload控件对上传大文件的限制成为了众多系统开发的瓶颈。该文详细描述了ASP.NET中如何通过引入第三方开源免费的组件实现大文件上传的技术方案。

关键词:ASP.NET;大文件上传;RadUpload

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)09-0112-02

Abstract: As a mainstream technology for developing dynamic Web program,ASP.NET has won the developersfavour.But its built-in FileUpload component for restricting large file becomes a bottleneck problems of many system developers.This paper describes the technical proposal that uploads large files with free third-component based on ASP.NET.

Key words: ASP.NET; large file upload; RadUpload

当前,ASP.NET因其拥有丰富的控件和强大的类库而成为开发动态Web程序的主流技术之一,利用它可以开发各种桌面软件或Web系统。大文件上传是许多系统开发中经常使用的功能模块,尤其对于一些视频网站而言,往往需要上传超大视频文件。然而ASP.NET内置的FileUpload控件对上传大文件有限制,其影响了用户体验度。为此,探究基于ASP.NET的大文件上传具有现实意义。

1 ASP.NET中FileUpload控件应用现状

ASP.NET是微软公司提出的一种专用于开发桌面软件或动态Web网页程序的技术,具有简便易用的特点[1]。FileUpload是ASP.NET中经常用到的上传文件控件,其主要功能是向服务器指定的目录上传文件。FileUpload控件具有如下优点:1)具有可视化的操作界面,借助Microsoft Visual Studio开发工具可以直接拖拽该控件至页面程序片段中即可,不需要编写程序实现;2)具有丰富的上传属性,如FileContent、FileName、HasFile等[2],可以利用它们快速获取上传文件信息;3)SaveAs方法调用灵活,程序片段中直接调用封装的SaveAs方法即可将本地文件上传至服务器。但是,FileUpload在实际应用过程中也暴露出了一些问题:1)不适合大文件上传,默认情况下上传的文件仅限于4M以内;2)不具有文件上传进度条,用户体验度不高。为此,众多系统开发者选择了自己开发控件或借助第三方开源免费组件的方式来上传大文件。

2 ASP.NET中大文件上传解决方案

考虑到系统开发的高效性与稳定性,本研究拟采用第三方开源免费组件来解决大文件上传问题。文件上传模块的实现主要涉及到页面和数据库设计、后台程序的编写两方面技术。

2.1 文件上传模块设计

一般而言,文件上传模块在系统中的呈现方式是灵活多样的,其可以是单独的上传页面形式,也可以是嵌入在页面中的“附件”形式。而对于开发者来说,不管是何种上传形式,在文件上传页面中应能获取到文件名、文件简介、上传路径、上传作者、上传时间等关键信息,对应的数据库字段依次可设置为FileName、FileInfo、UpDir、UpUser、UpTime。

2.2 上传组件介绍

目前,网络上出现的第三方大文件上传组件很多,如Uploadify、FancyUpload、AjaxFileUpload、jqUploader和RadUpload等[3]。此时选取一个适合当前系统开发需要的组件尤为重要,应注意如下原则:1)满足开发环境(Java/ASP.NET/Php等)的需要;2)操作简单,适合各级开发者使用;3)功能丰富、界面友好。结合笔者系统开发经验,本研究主要选取RadUpload作为上传组件,其具有如下特点:1)适合ASP.NET开发环境要求;2)该组件和ASP.NET内置的FileUpload控件进行了很好的融合,其属性和方法可互通,方便学习使用;3)对上传文件的大小没有限制,可以上传超大文件;4)带有可视化的上传进度条功能,用户体验度高;5)开源免费使用,便于二次开发。

2.3 关键技术

2.3.1 添加RadUpload组件引用

在RadUpload组件包中,主要包括RadUpload.Net2.dll、Telerik.QuickStart.dll和RadUpload.Net2.xml三个文件。其中,RadUpload.Net2.dll和Telerik.QuickStart.dll是RadUpload上传组件的核心文件,封装了许多方法,如SaveAs、GetFiles等;RadUpload.Net2.xml用户定义RadUpload组件的界面及样式。系统开发中,需要将以上三个文件放置到Bin文件目录下面,然后在页面中分别添加以下代码即可引用。

1)在前台Aspx文件头部分别添加:

<%@ Register TagPrefix="telerik" Namespace="Telerik.QuickStart" Assembly="Telerik.QuickStart" %>

<%@ Register TagPrefix="radU" Namespace="Telerik.WebControls" Assembly="RadUpload.Net2" %>;在Body标签中添加:

2)在后台CS文件中添加命名空间:using Telerik.WebControls;

2.3.2 编辑Web配置文件

Web配置文件可用来定义系统的全局变量及属性。在服务器调用RadUpload组件方法前,需要在Web配置文件中添加声明,并设置上传文件的最大值和最长时间。其具体方法如下:

1)在“”结点之间添加上传文件的最大值和最长时间:。此处表示上传的文件最大为300M,用时最长为1小时。

2)在“”结点之间添加RadUpload组件声明:

2.3.3 编写服务器端代码

配置好以上参数后即可开始编写服务器端脚本。客户机中的文件上传是通过调用服务器端FileUpload控件中的Button按钮事件来实现的,因此,上传文件的代码需要写在服务器端Button按钮事件中。关键代码如下:

protected void btnSave_Click(object sender, EventArgs e){ //Button按钮事件

if (RadUploadContext.Current.UploadedFiles.Count <= 0){ return; }

foreach (UploadedFile file in RadUploadContext.Current.UploadedFiles){

string Path = Server.MapPath("UpFiles/uploadfiles/");

string fileName = file.GetName();

Path = Path + fileName;

file.SaveAs(Path, true); //通过调用RadUpload的SaveAs方法上传文件

FileMis.Model.UpFiles model = new FileMis.Model. UpFiles ();

model.FileName = fileName;

model. FileInfo = TxtFileInfo.Text;

model. UpDir = Path;

model. UpUser = Session("username");

model. UpTime = DateTime.Now.ToString("yyyyMMddHHmmss");

FileMis.BLL. UpFiles bll = new FileMis.BLL. UpFiles ();

bll.Add(model); //向数据库插入新记录

}

}

3 大文件上传模块实现效果

笔者曾参与多项大型系统研发工作,其中很多系统都使用到以上大文件上传解决方案。以广西中小学微课资源网为例,本网站是在广西教育厅教师培训中心的领导下建立的面向广西中小学教师征集优质案例资源的门户网站系统。该系统须承载高并发、大文件上传的基本需求,可以满足广大教师同时上传课堂录像文件(详见下图1)。实践结果表明,利用以上解决方案可以上传超过2G的视频文件,且系统运行稳定。

4 结束语

基于ASP.NET的大文件上传是系统开发中经常遇到的一个棘手问题。利用第三方开源免费的大文件上传组件(如RadUpload)可以有效解决文件上传问题。本文以RadUpload为例描述了如何借助第三方组件实现大文件上传的技术方案,以期为相关研究领域和实践开发者提供参考借鉴。在后续研究中,我们将进一步探索大文件断点续传的技术方案。

参考文献:

[1] 张再华. 基于ASP.NET的Web服务及其开发技术[J]. 软件导刊, 2012(4): 134-135.

[2] 李志华, 林财兴. 利用FileUpload控件实现多文件上传[J]. 科技信息, 2008(28): 390-391.

[3] 王申, 杨宇鹏. 基于Java的文件上传组件的实现[J]. 电脑编程技巧与维护, 2005(8): 227-229.