趙學(xué)孔 龍世榮
摘要:ASP.NET作為當(dāng)前開發(fā)動(dòng)態(tài)Web程序的主流技術(shù)備受系統(tǒng)開發(fā)者的青睞,但其內(nèi)置的FileUpload控件對(duì)上傳大文件的限制成為了眾多系統(tǒng)開發(fā)的瓶頸。該文詳細(xì)描述了ASP.NET中如何通過引入第三方開源免費(fèi)的組件實(shí)現(xiàn)大文件上傳的技術(shù)方案。
關(guān)鍵詞:ASP.NET;大文件上傳;RadUpload
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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
當(dāng)前,ASP.NET因其擁有豐富的控件和強(qiáng)大的類庫(kù)而成為開發(fā)動(dòng)態(tài)Web程序的主流技術(shù)之一,利用它可以開發(fā)各種桌面軟件或Web系統(tǒng)。大文件上傳是許多系統(tǒng)開發(fā)中經(jīng)常使用的功能模塊,尤其對(duì)于一些視頻網(wǎng)站而言,往往需要上傳超大視頻文件。然而ASP.NET內(nèi)置的FileUpload控件對(duì)上傳大文件有限制,其影響了用戶體驗(yàn)度。為此,探究基于ASP.NET的大文件上傳具有現(xiàn)實(shí)意義。
1 ASP.NET中FileUpload控件應(yīng)用現(xiàn)狀
ASP.NET是微軟公司提出的一種專用于開發(fā)桌面軟件或動(dòng)態(tài)Web網(wǎng)頁程序的技術(shù),具有簡(jiǎn)便易用的特點(diǎn)[1]。FileUpload是ASP.NET中經(jīng)常用到的上傳文件控件,其主要功能是向服務(wù)器指定的目錄上傳文件。FileUpload控件具有如下優(yōu)點(diǎn):1)具有可視化的操作界面,借助Microsoft Visual Studio開發(fā)工具可以直接拖拽該控件至頁面程序片段中即可,不需要編寫程序?qū)崿F(xiàn);2)具有豐富的上傳屬性,如FileContent、FileName、HasFile等[2],可以利用它們快速獲取上傳文件信息;3)SaveAs方法調(diào)用靈活,程序片段中直接調(diào)用封裝的SaveAs方法即可將本地文件上傳至服務(wù)器。但是,F(xiàn)ileUpload在實(shí)際應(yīng)用過程中也暴露出了一些問題:1)不適合大文件上傳,默認(rèn)情況下上傳的文件僅限于4M以內(nèi);2)不具有文件上傳進(jìn)度條,用戶體驗(yàn)度不高。為此,眾多系統(tǒng)開發(fā)者選擇了自己開發(fā)控件或借助第三方開源免費(fèi)組件的方式來上傳大文件。
2 ASP.NET中大文件上傳解決方案
考慮到系統(tǒng)開發(fā)的高效性與穩(wěn)定性,本研究擬采用第三方開源免費(fèi)組件來解決大文件上傳問題。文件上傳模塊的實(shí)現(xiàn)主要涉及到頁面和數(shù)據(jù)庫(kù)設(shè)計(jì)、后臺(tái)程序的編寫兩方面技術(shù)。
2.1 文件上傳模塊設(shè)計(jì)
一般而言,文件上傳模塊在系統(tǒng)中的呈現(xiàn)方式是靈活多樣的,其可以是單獨(dú)的上傳頁面形式,也可以是嵌入在頁面中的“附件”形式。而對(duì)于開發(fā)者來說,不管是何種上傳形式,在文件上傳頁面中應(yīng)能獲取到文件名、文件簡(jiǎn)介、上傳路徑、上傳作者、上傳時(shí)間等關(guān)鍵信息,對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段依次可設(shè)置為FileName、FileInfo、UpDir、UpUser、UpTime。
2.2 上傳組件介紹
目前,網(wǎng)絡(luò)上出現(xiàn)的第三方大文件上傳組件很多,如Uploadify、FancyUpload、AjaxFileUpload、jqUploader和RadUpload等[3]。此時(shí)選取一個(gè)適合當(dāng)前系統(tǒng)開發(fā)需要的組件尤為重要,應(yīng)注意如下原則:1)滿足開發(fā)環(huán)境(Java/ASP.NET/Php等)的需要;2)操作簡(jiǎn)單,適合各級(jí)開發(fā)者使用;3)功能豐富、界面友好。結(jié)合筆者系統(tǒng)開發(fā)經(jīng)驗(yàn),本研究主要選取RadUpload作為上傳組件,其具有如下特點(diǎn):1)適合ASP.NET開發(fā)環(huán)境要求;2)該組件和ASP.NET內(nèi)置的FileUpload控件進(jìn)行了很好的融合,其屬性和方法可互通,方便學(xué)習(xí)使用;3)對(duì)上傳文件的大小沒有限制,可以上傳超大文件;4)帶有可視化的上傳進(jìn)度條功能,用戶體驗(yàn)度高;5)開源免費(fèi)使用,便于二次開發(fā)。
2.3 關(guān)鍵技術(shù)
2.3.1 添加RadUpload組件引用
在RadUpload組件包中,主要包括RadUpload.Net2.dll、Telerik.QuickStart.dll和RadUpload.Net2.xml三個(gè)文件。其中,RadUpload.Net2.dll和Telerik.QuickStart.dll是RadUpload上傳組件的核心文件,封裝了許多方法,如SaveAs、GetFiles等;RadUpload.Net2.xml用戶定義RadUpload組件的界面及樣式。系統(tǒng)開發(fā)中,需要將以上三個(gè)文件放置到Bin文件目錄下面,然后在頁面中分別添加以下代碼即可引用。
1)在前臺(tái)Aspx文件頭部分別添加:
<%@ Register TagPrefix="telerik" Namespace="Telerik.QuickStart" Assembly="Telerik.QuickStart" %>
<%@ Register TagPrefix="radU" Namespace="Telerik.WebControls" Assembly="RadUpload.Net2" %>;在Body標(biāo)簽中添加:
2)在后臺(tái)CS文件中添加命名空間:using Telerik.WebControls;
2.3.2 編輯Web配置文件
Web配置文件可用來定義系統(tǒng)的全局變量及屬性。在服務(wù)器調(diào)用RadUpload組件方法前,需要在Web配置文件中添加聲明,并設(shè)置上傳文件的最大值和最長(zhǎng)時(shí)間。其具體方法如下:
1)在“
2)在“
2.3.3 編寫服務(wù)器端代碼
配置好以上參數(shù)后即可開始編寫服務(wù)器端腳本??蛻魴C(jī)中的文件上傳是通過調(diào)用服務(wù)器端FileUpload控件中的Button按鈕事件來實(shí)現(xiàn)的,因此,上傳文件的代碼需要寫在服務(wù)器端Button按鈕事件中。關(guān)鍵代碼如下:
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); //通過調(diào)用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); //向數(shù)據(jù)庫(kù)插入新記錄
}
}
3 大文件上傳模塊實(shí)現(xiàn)效果
筆者曾參與多項(xiàng)大型系統(tǒng)研發(fā)工作,其中很多系統(tǒng)都使用到以上大文件上傳解決方案。以廣西中小學(xué)微課資源網(wǎng)為例,本網(wǎng)站是在廣西教育廳教師培訓(xùn)中心的領(lǐng)導(dǎo)下建立的面向廣西中小學(xué)教師征集優(yōu)質(zhì)案例資源的門戶網(wǎng)站系統(tǒng)。該系統(tǒng)須承載高并發(fā)、大文件上傳的基本需求,可以滿足廣大教師同時(shí)上傳課堂錄像文件(詳見下圖1)。實(shí)踐結(jié)果表明,利用以上解決方案可以上傳超過2G的視頻文件,且系統(tǒng)運(yùn)行穩(wěn)定。
4 結(jié)束語
基于ASP.NET的大文件上傳是系統(tǒng)開發(fā)中經(jīng)常遇到的一個(gè)棘手問題。利用第三方開源免費(fèi)的大文件上傳組件(如RadUpload)可以有效解決文件上傳問題。本文以RadUpload為例描述了如何借助第三方組件實(shí)現(xiàn)大文件上傳的技術(shù)方案,以期為相關(guān)研究領(lǐng)域和實(shí)踐開發(fā)者提供參考借鑒。在后續(xù)研究中,我們將進(jìn)一步探索大文件斷點(diǎn)續(xù)傳的技術(shù)方案。
參考文獻(xiàn):
[1] 張?jiān)偃A. 基于ASP.NET的Web服務(wù)及其開發(fā)技術(shù)[J]. 軟件導(dǎo)刊, 2012(4): 134-135.
[2] 李志華, 林財(cái)興. 利用FileUpload控件實(shí)現(xiàn)多文件上傳[J]. 科技信息, 2008(28): 390-391.
[3] 王申, 楊宇鵬. 基于Java的文件上傳組件的實(shí)現(xiàn)[J]. 電腦編程技巧與維護(hù), 2005(8): 227-229.