• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2012-04-29 15:01:22謝生鋒
      電腦知識與技術 2012年23期
      關鍵詞:分塊

      謝生鋒

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

      關鍵詞:上傳;下載;大文件;ASP.NET;分塊

      中圖分類號:TP393文獻標識碼:A文章編號: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)網的日益普及和發(fā)展,軟件架構由原來的C/S架構也越來越多的轉向B/S架構,在開發(fā)B/S架構的應用程序過程中,經常涉及對文件的上傳和下載操作。文件的上傳是在客戶端將文件上傳到服務器端,文件下載是將服務器端的文件下載到客戶端。該文主要介紹使用ASP.NET技術來實現(xiàn)文件的上傳和下載模塊功能,ASP.NET是.NET Framework平臺上的一門用于開發(fā)服務器端Web應用程序的框架,可以使用任何支持.NET平臺的語言,如VB.NET或C#進行開發(fā)。

      1文件上傳

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

      1.1 FileUpload控件

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

      appRequestQueueLimit="5000" />

      其中maxRequestLength屬性是客戶端請求服務器端的數(shù)據(jù)容量的最大值,單位為KB。executionTimeout屬性是客戶端請求服務端的有效時間,單位是秒。appRequestQueueLimit屬性是當前站點的排隊請求的最大個數(shù)。

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

      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異常處理語句來捕獲異常,但是筆者在測試的過程發(fā)現(xiàn),當上傳的文件大小超過maxRequest Length屬性的設置值時,并沒有捕獲到異常,可以看出FileUpload控件的實現(xiàn)機制是:在頁面上選定要上傳的文件時,客戶端會自動把文件的大小回發(fā)到服務器端,然后服務器端通過讀取Web.Config文件的HttpRuntime節(jié)點中的maxRequestLength的屬性值,如果文件的大小小于設置的屬性值,則處理客戶端發(fā)送過來的請求,否則不處理客戶端發(fā)送過來的請求。這也是在測試的過程中,當上傳文件的大小超過設置的屬性值時,單擊按鈕事件沒響應的原因。

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

      1.2 uploadify插件

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

      $("#uploadify").uploadify({

      script: FileProcess.ashx, //后臺處理文件

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

      queueID: fileQueue,

      multi: true, //是否多選

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

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

      });

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

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

      解決大文件上傳的思路就是在HttpHandler處理Web請求之前截取并處理它,需要自定義一個HttpModule,也就是創(chuàng)建實現(xiàn)IHttpModule接口的類。將獲取Web請求數(shù)據(jù)的程序寫入其中,再將此模塊插入到請求處理管道即可。利用HttpWorkerRequest對象建立一個分塊以獲取Web請求數(shù)據(jù),首先用GetPreloadedEntityBody函數(shù)獲取Web請求已被傳入的部分,然后利用IsEntireEntity BodyIsPreloaded函數(shù)來判斷是否全部Web請求數(shù)據(jù)已傳上來了,如果沒有則反復利用ReadEntityBody函數(shù)來分塊讀取后續(xù)上傳的Web請求塊,直至獲取全部Web請求數(shù)據(jù)。上傳的文件大于4M利用HttpWorkerRequest對象處理,不超過4M的文件由ASP.NET內置的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文件下載

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

      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結束語

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

      參考文獻:

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

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

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

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

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

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

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

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

      猜你喜歡
      分塊
      分塊矩陣在線性代數(shù)中的應用
      反三角分塊矩陣Drazin逆新的表示
      基于自適應中值濾波的分塊壓縮感知人臉識別
      基于多分辨率半邊的分塊LOD模型無縫表達
      甘洛县| 南安市| 井研县| 广德县| 普定县| 灵石县| 福鼎市| 通江县| 新乡县| 绥滨县| 金阳县| 嘉峪关市| 精河县| 长岭县| 辽阳县| 京山县| 革吉县| 隆林| 屏东市| 梁河县| 霍城县| 牙克石市| 乌拉特中旗| 北海市| 佛冈县| 开封市| 平邑县| 天长市| 佳木斯市| 泽州县| 米林县| 始兴县| 四会市| 平乡县| 曲麻莱县| 潜山县| 沙河市| 九龙县| 江西省| 丰顺县| 清新县|