国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ASP.NET的文件上傳和下載模塊實(shí)現(xiàn)的研究

2012-04-29 15:01:22謝生鋒
電腦知識(shí)與技術(shù) 2012年23期
關(guān)鍵詞:分塊

謝生鋒

摘要:文件上傳和下載是Web程序開(kāi)發(fā)中常用的功能,有著廣泛的應(yīng)用。該文分析了ASP.NET中幾種常用的文件上傳和下載技術(shù),由于利用ASP.NET內(nèi)置的上傳組件來(lái)完成大文件的上傳有限制,重點(diǎn)闡述了大文件的上傳和下載技術(shù),并給出了解決方案,這樣保證了在電影視頻網(wǎng)站中的正常應(yīng)用。

關(guān)鍵詞:上傳;下載;大文件;ASP.NET;分塊

中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)23-5617-03

Research of Uploading and Downloading Module of Files Based on ASP.NET

XIE Sheng-feng

(Computer Department, Henan Mechanical and Electrical Engineering College, Xinxiang 453002, China)

Abstract: File uploading and downloading is commonly functions in Web procedures , and is widely used .This paper analyzes several kinds of means of file uploading and downloading in ASP.NET, and due to the limit of the ASP.NET built-in upload components to com? plete large file uploading, elaborated with emphasis on the large file uploading and downloading technology, and gives the solutions, to en? sure that it is in the normal application in film video sites.

Key words: uploading; downloading; large file; ASP.NET; block

隨著互聯(lián)網(wǎng)的日益普及和發(fā)展,軟件架構(gòu)由原來(lái)的C/S架構(gòu)也越來(lái)越多的轉(zhuǎn)向B/S架構(gòu),在開(kāi)發(fā)B/S架構(gòu)的應(yīng)用程序過(guò)程中,經(jīng)常涉及對(duì)文件的上傳和下載操作。文件的上傳是在客戶端將文件上傳到服務(wù)器端,文件下載是將服務(wù)器端的文件下載到客戶端。該文主要介紹使用ASP.NET技術(shù)來(lái)實(shí)現(xiàn)文件的上傳和下載模塊功能,ASP.NET是.NET Framework平臺(tái)上的一門(mén)用于開(kāi)發(fā)服務(wù)器端Web應(yīng)用程序的框架,可以使用任何支持.NET平臺(tái)的語(yǔ)言,如VB.NET或C#進(jìn)行開(kāi)發(fā)。

1文件上傳

文件上傳分為小文件上傳和大文件上傳,小文件的上傳可以采用ASP.NET內(nèi)置的控件或者插件機(jī)制來(lái)實(shí)現(xiàn),比如FileUpload控件和jQurey中的uploadify插件,大文件的實(shí)現(xiàn)采用Http管道模型實(shí)現(xiàn)。

1.1 FileUpload控件

FileUpload控件是ASP.NET中的一個(gè)專門(mén)處理文件上傳的控件,利用FileUpload控件可以上傳一些小圖片或者文檔。它限制上傳文件大小的默認(rèn)值是4M,客戶端請(qǐng)求服務(wù)端的有效時(shí)間的默認(rèn)值是110秒??梢栽赪eb.Config文件添加HttpRuntime節(jié)點(diǎn),并設(shè)置相關(guān)屬性,通過(guò)更改屬性的默認(rèn)值。代碼如下:

appRequestQueueLimit="5000" />

其中maxRequestLength屬性是客戶端請(qǐng)求服務(wù)器端的數(shù)據(jù)容量的最大值,單位為KB。executionTimeout屬性是客戶端請(qǐng)求服務(wù)端的有效時(shí)間,單位是秒。appRequestQueueLimit屬性是當(dāng)前站點(diǎn)的排隊(duì)請(qǐng)求的最大個(gè)數(shù)。

利用FileUpload控件實(shí)現(xiàn)文件上傳,需要在前臺(tái)頁(yè)面拖入一個(gè)FileUpload控件和Button控件,用C#編寫(xiě)后臺(tái)頁(yè)面代碼,首先判斷上傳文件是否存在,然后是獲取上傳文件保存在服務(wù)端的路徑,最后是調(diào)用SaveAs方法在服務(wù)器端保存上傳文件的內(nèi)容。主要代碼如下:

string filePath = fileUp.PostedFile.FileName;

string fileName = filePath.Substring(filePath.LastIndexOf("\") + 1);

try

{ string savePath = Server.MapPath("Files/") + fileName;

fileUp.PostedFile.SaveAs(savePath);

Response.Write("");}

catch (Exception ex)

{ Response.Write("");

}

在上述代碼中,采用try…catch異常處理語(yǔ)句來(lái)捕獲異常,但是筆者在測(cè)試的過(guò)程發(fā)現(xiàn),當(dāng)上傳的文件大小超過(guò)maxRequest Length屬性的設(shè)置值時(shí),并沒(méi)有捕獲到異常,可以看出FileUpload控件的實(shí)現(xiàn)機(jī)制是:在頁(yè)面上選定要上傳的文件時(shí),客戶端會(huì)自動(dòng)把文件的大小回發(fā)到服務(wù)器端,然后服務(wù)器端通過(guò)讀取Web.Config文件的HttpRuntime節(jié)點(diǎn)中的maxRequestLength的屬性值,如果文件的大小小于設(shè)置的屬性值,則處理客戶端發(fā)送過(guò)來(lái)的請(qǐng)求,否則不處理客戶端發(fā)送過(guò)來(lái)的請(qǐng)求。這也是在測(cè)試的過(guò)程中,當(dāng)上傳文件的大小超過(guò)設(shè)置的屬性值時(shí),單擊按鈕事件沒(méi)響應(yīng)的原因。

FileUpload控件之所以默認(rèn)的文件大小上限為4MB,是為了防止拒絕服務(wù)攻擊。如果通過(guò)修改配置文件讓大文件上傳的要求得到強(qiáng)制執(zhí)行,或者同時(shí)上傳的用戶太多,對(duì)于早期版本ASP.NET 1.0和1.1中,這樣會(huì)把所有請(qǐng)求數(shù)據(jù)全部上傳到服務(wù)器內(nèi)存中,造成服務(wù)器內(nèi)存資源耗盡。但是從ASP.NET 2.0版本以后,用戶上傳數(shù)據(jù)超過(guò)一定數(shù)量之后將其存在硬盤(pán)中的臨時(shí)文件中,在httpRuntime里通過(guò)requestLengthDiskThreshold屬性來(lái)設(shè)置輸入流緩沖閾值的限值,其默認(rèn)值為80KB,即一個(gè)請(qǐng)求內(nèi)容超過(guò)80KB時(shí)就會(huì)啟用硬盤(pán)作為緩存,這個(gè)閾值和客戶端是否是在上傳內(nèi)容無(wú)關(guān),只關(guān)心客戶端發(fā)來(lái)的請(qǐng)求大于這個(gè)值。因此,在ASP.NET 2.0以后的版本中服務(wù)器的內(nèi)存不會(huì)因?yàn)榭蛻舳说漠惓U?qǐng)求而耗盡。

1.2 uploadify插件

利用FileUpload控件雖然能上傳文件,但是不能顯示文件的上傳進(jìn)度,也就是沒(méi)有進(jìn)度條,而uploadify插件很好的解決了這個(gè)問(wèn)題。uploadify插件是jQurey框架中的一個(gè)插件,jQurey是一個(gè)快速、簡(jiǎn)潔的JavaScript框架,使用戶更方便地把動(dòng)態(tài)功能應(yīng)用到頁(yè)面,包括應(yīng)用Ajax技術(shù)、添加動(dòng)畫(huà)和特效等。uploadify插件是一個(gè)基于Flash技術(shù)的文件上傳的jQurey插件,它的功能包括一次性選擇多個(gè)文件上傳,查看上傳進(jìn)度,控制文件上傳類型和大小等。在ASP.NET中可以使用后綴名為ashx文件作為服務(wù)器端處理上傳的文件。uploadify插件的常用屬性賦值代碼如下:

$("#uploadify").uploadify({

script: FileProcess.ashx, //后臺(tái)處理文件

folder: /Files, //上傳到服務(wù)器端的文件夾

queueID: fileQueue,

multi: true, //是否多選

sizeLimit: 40960, //上傳文件限制的最大值

fileExt: *.jpg;*.rmvb;*.flv;*.doc, //設(shè)置文件類型

});

后臺(tái)處理文件的一般處理程序需要實(shí)現(xiàn)IHttpHandler接口,在ProcessReques事件中,首先要獲取頁(yè)面表單提交的內(nèi)容,實(shí)現(xiàn)服務(wù)器端的文件夾路徑,然后通過(guò)調(diào)用SaveAs方法將上傳文件保存在服務(wù)器端的文件夾中。1.3大文件上傳

利用FileUpload控件和uploadify插件只能解決小文件的上傳問(wèn)題,那么在視頻點(diǎn)播系統(tǒng)會(huì)遇到幾百兆甚至更大的文件上傳,前面講到的兩種方法就不適用了。首先需要分析一下ASP.NET頁(yè)面請(qǐng)求的原理,首先客戶端的Web請(qǐng)求被服務(wù)器的進(jìn)程inetinfo.exe截獲,然后該進(jìn)程判斷頁(yè)面后綴,根據(jù)iis中配置決定調(diào)用具體的擴(kuò)展程序,例如后綴名是aspx就會(huì)調(diào)用aspnet_isapi.dll,然后由aspnet_isapi.dll發(fā)送給iis工作者進(jìn)程,最后由iis工作者進(jìn)程調(diào)用.net類庫(kù)進(jìn)行具體處理,具體包括兩個(gè)核心機(jī)制HTTP處理程序和HTTP模塊。HTTP處理程序是響應(yīng)對(duì)ASP.NET Web應(yīng)用程序的請(qǐng)求而運(yùn)行的終結(jié)點(diǎn)。最常用的處理程序是處理.aspx文件的ASP.NET頁(yè)處理程序。HTTP模塊是一個(gè)在每次針對(duì)應(yīng)用程序發(fā)出請(qǐng)求時(shí)調(diào)用的程序集。HTTP模塊作為ASP.NET請(qǐng)求管道的一部分調(diào)用,它們能夠在整個(gè)請(qǐng)求過(guò)程中訪問(wèn)生命周期事件。HTTP模塊使您可以檢查傳入和傳出的請(qǐng)求并根據(jù)該請(qǐng)求進(jìn)行操作。

解決大文件上傳的思路就是在HttpHandler處理Web請(qǐng)求之前截取并處理它,需要自定義一個(gè)HttpModule,也就是創(chuàng)建實(shí)現(xiàn)IHttpModule接口的類。將獲取Web請(qǐng)求數(shù)據(jù)的程序?qū)懭肫渲?再將此模塊插入到請(qǐng)求處理管道即可。利用HttpWorkerRequest對(duì)象建立一個(gè)分塊以獲取Web請(qǐng)求數(shù)據(jù),首先用GetPreloadedEntityBody函數(shù)獲取Web請(qǐng)求已被傳入的部分,然后利用IsEntireEntity BodyIsPreloaded函數(shù)來(lái)判斷是否全部Web請(qǐng)求數(shù)據(jù)已傳上來(lái)了,如果沒(méi)有則反復(fù)利用ReadEntityBody函數(shù)來(lái)分塊讀取后續(xù)上傳的Web請(qǐng)求塊,直至獲取全部Web請(qǐng)求數(shù)據(jù)。上傳的文件大于4M利用HttpWorkerRequest對(duì)象處理,不超過(guò)4M的文件由ASP.NET內(nèi)置的FileUpload控件處理,主要代碼如下:

IServiceProvider provider = (IServiceProvider)context;

HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

FileStream fs = null;

if (wr.HasEntityBody())

{ int requestLength = wr.GetTotalEntityBodyLength();

int initialBytes = 0;

if (!wr.IsEntireEntityBodyIsPreloaded())

{ byte[] buffer = new byte[100];

HttpPostedFile file = context.Request.Files["fileUp"];

string filePath = file.FileName;

string fileName = filePath.Substring(filePath.LastIndexOf("\") + 1); fs = new FileStream(context.Server.MapPath("~/Files/"+file? Name),FileMode.CreateNew);

……

} }

2文件下載

文件下載是應(yīng)用程序中的一個(gè)重要功能,下載的文件類型可以是圖片、文檔、軟件等,ASP.NET提供了幾種文件下載的解決方案,包括WriteFile方法、BinaryWrite方法流式傳送文件和TransferFile方法。其中WriteFile方法和BinaryWrite方法都是需要在內(nèi)存中緩沖文件,然后寫(xiě)入HTTP響應(yīng)輸出流,這樣對(duì)于下載大文件時(shí),會(huì)占用大量服務(wù)器內(nèi)存資源,容易使服務(wù)器受到拒絕服務(wù)攻擊。而TransferFile方法則不在內(nèi)存中緩沖文件,直接寫(xiě)入HTTP響應(yīng)輸出流,但是TransferFile方法適用于400M以上的文件下載。因此可以采用分塊下載來(lái)適用各種文件大小的下載,也就是每次從服務(wù)器端讀取固定大小的數(shù)據(jù),在緩沖區(qū)處理后發(fā)送給客戶端,這樣就保證了服務(wù)器內(nèi)存資源不被大量占用。主要代碼如下:

while (dataToRead > 0)

{ if (Response.IsClientConnected)

{ length = iStream.Read(buffer, 0, 10240);

Response.OutputStream.Write(buffer, 0, length);

Response.Flush();

buffer = new Byte[10240];

dataToRead = dataToRead - length;}

else

{ dataToRead = -1;

} }

3結(jié)束語(yǔ)

總之,文件上傳和下載功能是應(yīng)用系統(tǒng)中的一個(gè)常用功能模塊,研究其實(shí)現(xiàn)方式具有重要的意義,該文分析了ASP.NET中的文件上傳和下載的各種方法及其優(yōu)缺點(diǎn),隨著新技術(shù)的不斷出現(xiàn),Web編程中的文件上傳和下載的技術(shù)問(wèn)題還有待進(jìn)一步研究。

參考文獻(xiàn):

[1]李萬(wàn)彪.ASP.NET 2.0中文件上傳安全解決方案[J].電腦知識(shí)與技術(shù),2009,5(8).

[2]彭勝,劉衛(wèi)國(guó),文學(xué)志.利用ASP.NET內(nèi)置上傳組件實(shí)現(xiàn)大文件上傳[J].軟件導(dǎo)報(bào),2008,7(1).

[3]郭立軍,王邦元.基于ASP.NET的多個(gè)大文件上傳方法[J].福建電腦,2008(9).

[4]李穎云,張克.基于asp.net的文件上傳和下載[J].電腦知識(shí)與技術(shù),2007(6).

[5]洪石丹.ASP.NET范例開(kāi)發(fā)大全[M].北京:清華大學(xué)出版社,2010.

[6]房大偉,呂雙.ASP.NET開(kāi)發(fā)實(shí)戰(zhàn)1200例[M].北京:清華大學(xué)出版社,2011.

[7]王偉平,郝軍啟,唐有明.精通JS腳本之jQuery框架[M].北京:化學(xué)工業(yè)出版社,2011.

[8]楊曉軍,秦方.MVC Web開(kāi)發(fā)學(xué)習(xí)記錄[M].北京:清華大學(xué)出版社,2011.

猜你喜歡
分塊
分塊矩陣在線性代數(shù)中的應(yīng)用
反三角分塊矩陣Drazin逆新的表示
基于自適應(yīng)中值濾波的分塊壓縮感知人臉識(shí)別
基于多分辨率半邊的分塊LOD模型無(wú)縫表達(dá)
赤水市| 蓬莱市| 涟源市| 建瓯市| 宁阳县| 白城市| 黄骅市| 罗平县| 宁都县| 宣威市| 巨鹿县| 徐闻县| 余庆县| 昂仁县| 平凉市| 大连市| 兴山县| 正宁县| 拉萨市| 务川| 咸阳市| 蓬安县| 广德县| 万全县| 临武县| 临汾市| 申扎县| 响水县| 虞城县| 阜康市| 和龙市| 三穗县| 河北省| 宜城市| 定日县| 孟村| 西青区| 抚顺市| 安国市| 咸阳市| 合川市|