在ASP.NET中處理大檔案上傳 )

來源:互聯網
上載者:User
文章目錄
  • 允許大檔案上傳
  • 給使用者充分提示
  • 更好的解決方案

使用過ASP.NET的開發人員都知道,FileUpload控制項是一把雙刃劍——既可能成為我們的救世主,也能變成我們的敵人。其中一個很常見的問題就是如何處理超過4MB的大檔案上傳。

微軟的ASP.NET MVP Jon Galloway最近發表了一篇文章,其中討論了FileUpload控制項的種種提示。瞭解了這些之後,我們即可在理論上處理任何大小的檔案上傳。

允許大檔案上傳

Jon提到,使用FileUpload控制項進行檔案上傳是一件非常有技巧性的事情。開發人員應該瞭解的是,之所以預設的檔案大小上限為4MB,並不是因為當時的設計人員靈光一現,而是為了避免潛在DOS攻擊危險。

若是攻擊者提交了一個或多個大檔案,往往會讓伺服器不堪重負。若是使用者上傳的檔案大於4MB,將會得到“Maximum request length exceeded.”異常資訊。

想增加這個尺寸的上限並沒有什麼難度,不過開發人員需要知道怎樣做才是最好的方法。預設的4MB設定於系統的machine.config檔案中,不過我們在web.config中即可覆蓋該值。

例如,若想將上傳檔案的上限提高至20MB,我們只需要這樣修改:

<system.web>  <httpRuntime executionTimeout="240" maxRequestLength="20480" /></system.web>

若是在machine.config中對該值進行了修改,那麼同時受到影響的就不只是這一個網站。ASP.NET之所以設計了這樣的上限,就是為了避免潛 在的攻擊。所以最好的方式是在某個特定目錄中進行覆蓋,而不是整個應用程式。web.config檔案的格式非常靈活,因此實現這樣的需求也不難:

web.config檔案允許級聯覆蓋,所以很容易就能夠實現這個要求。我們可以在某個檔案夾中添加web.config檔案,並書寫上述配置,或者乾脆在web.config檔案中添加一個專門的<location />標籤,也能達到同樣的效果:

<location path="Upload">    <system.web>        <httpRuntime executionTimeout="110" maxRequestLength="20000" />    </system.web></location>

 

對於允許大檔案上傳來說,改變預設的上傳檔案大小限制僅僅是我們要做的第一步。一篇名為檔案上傳的不為人知一面的文章揭示了更多有關與IIS配合完成檔案上傳的細節。

若是上傳的檔案太大的話,往往會出現一些很有意思的情況。無論maxRequestLength 在中設定成什麼,IIS都會不假思索地接受,但隨後在ASP.NET檢查時就會拋出異常。

這篇文章還提到:

當然很容易就可以捕獲到這個異常,不過這並不是我們所期待的。還有一種方法是覆寫Page.OnError方法,並通過檢查在發生HttpException異常時HTTP響應代碼是否為400來判斷,不過這也不夠完美。

給使用者充分提示

一個讓使用者很反感的做法就是誤導使用者,而且在Web應用程式執行操作時也不給使用者任何提示。檔案尺寸的限制寫在web.config中,所以將一段提示文字放在web.config中也就變成了件非常自然的事。

最好的做法就是在運行時讀取web.config中的httpRuntime節,並轉化為HttpRuntimeSection對象。非常簡單:

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection; double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);FileSizeLimit.Text = string.Format("Make sure your file is under {0:0.#} MB.", maxFileSize);

 

這個解決方案清晰易懂,也沒有什麼冗繁的代碼。

更好的解決方案

還有一些商用的解決方案供我們選擇。這些解決方案通過HttpHandler實現,在通過進度條給使用者充分提示的同時,也讓我們開發人員能夠更好地控制檔案大小以及上傳過程中可能出現的異常。

下面是一些常見的組件:

  • FileUploader.NET (MediaChase公司,$310以上)
  • RadUpload (Telerik公司,$249)
  • NeatUpload (免費,遵守LGPL協議)

文章建議,最好的解決方案是使用RIA,例如那些用ASP.NET和Silverlight編寫的上傳組件。

大多數情況下,我建議用給予Silverlight或Flash的上傳組件來替代傳統的FileUpload組件。這類組件不單單提供了更好的上傳體驗,也通常會比<input type="file">在頁面上產生的文字框和按鈕要漂亮一些。這個<input type="file">並不能夠通過CSS添加樣式,雖然總是有人嘗試去尋找一些方法。

雖然目前並沒有什麼商業上傳組件使用了Silverlight,不過我們可以找到一個樣本程式示範了用Silverlight進行多檔案上傳的方法。

哪怕是如同檔案上傳一般微不足道的問題,我們都能夠找到很多種不同的方法來解決。而最大的挑戰在於分析各種不同做法的利弊,以及衡量用各個做法解決這個問題所要花費的時間和金錢。只有仔細分析計劃之後,我們才能夠找到最適合項目中使用的方法。

查看英文原文:Handling Large File Uploads in ASP.NET

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.