ASP.NET大文件上傳方法淺析
使用過ASP.NET的開發(fā)者都知道,F(xiàn)ileUpload控件是一把雙刃劍——既可能成為我們的救世主,也能變成我們的敵人。其中一個很常見的問題就是如何處理超過4MB的大文件上傳。
微軟的ASP.NET MVP Jon Galloway最近發(fā)表了一篇文章,其中討論了FileUpload控件的種種使用技巧。了解了這些之后,我們即可在理論上處理任何大小的文件上傳。
允許ASP.NET大文件上傳
Jon提到,使用FileUpload控件進行文件上傳是一件非常有技巧性的事情。開發(fā)者應(yīng)該了解的是,之所以默認的文件大小上限為4MB,并不是因為當(dāng)時的設(shè)計人員靈光一現(xiàn),而是為了避免潛在DOS攻擊危險。
若是攻擊者提交了一個或多個大文件,往往會讓服務(wù)器不堪重負。若是用戶上傳的文件大于4MB,將會得到“Maximum request length exceeded.”異常信息。
想增加這個尺寸的上限并沒有什么難度,不過開發(fā)者需要知道怎樣做才是最好的方法。默認的4MB設(shè)定于系統(tǒng)的machine.config文件中,不過我們在web.config中即可覆蓋該值。
例如,若想將上傳文件的上限提高至20MB,我們只需要這樣修改:
- <system.web> <httpRuntime executionTimeout="240" maxRequestLength="20480" /></system.web>
若是在machine.config中對該值進行了修改,那么同時受到影響的就不只是這一個網(wǎng)站。ASP.NET之所以設(shè)計了這樣的上限,就是為了避免潛 在的攻擊。所以最好的方式是在某個特定目錄中進行覆蓋,而不是整個應(yīng)用程序。web.config文件的格式非常靈活,因此實現(xiàn)這樣的需求也不難:
web.config文件允許級聯(lián)覆蓋,所以很容易就能夠?qū)崿F(xiàn)這個要求。我們可以在某個文件夾中添加web.config文件,并書寫上述配置,或者干脆在web.config文件中添加一個專門的<location />標(biāo)簽,也能達到同樣的效果:
- <location path="Upload"> <system.web> <httpRuntime executionTimeout="110" maxRequestLength="20000" />
</system.web></location>
對于允許ASP.NET大文件上傳來說,改變默認的上傳文件大小限制僅僅是我們要做的第一步。
若是ASP.NET大文件上傳的話,往往會出現(xiàn)一些很有意思的情況。無論maxRequestLength 在中設(shè)置成什么,IIS都會不假思索地接受,但隨后在ASP.NET檢查時就會拋出異常。
當(dāng)然很容易就可以捕獲到這個異常,不過這并不是我們所期待的。還有一種方法是覆寫Page.OnError方法,并通過檢查在發(fā)生HttpException異常時HTTP響應(yīng)代碼是否為400來判斷,不過這也不夠完美。
給用戶充分提示
一個讓用戶很反感的做法就是誤導(dǎo)用戶,而且在Web應(yīng)用程序執(zhí)行操作時也不給用戶任何提示。文件尺寸的限制寫在web.config中,所以將一段提示文字放在web.config中也就變成了件非常自然的事。
最好的做法就是在運行時讀取web.config中的httpRuntime節(jié),并轉(zhuǎn)化為HttpRuntimeSection對象。
更好的解決方案
還有一些商用的解決方案供我們選擇。這些解決方案通過HttpHandler實現(xiàn),在通過進度條給用戶充分提示的同時,也讓我們開發(fā)人員能夠更好地控制文件大小以及上傳過程中可能出現(xiàn)的異常。
下面是一些常見的ASP.NET大文件上傳組件:
◆FileUploader.NET (MediaChase公司,$310以上)
◆RadUpload (Telerik公司,$249)
◆NeatUpload (免費,遵守LGPL協(xié)議)
文章建議,最好的解決方案是使用RIA,例如那些用ASP.NET和Silverlight編寫的上傳組件。
大多數(shù)情況下,我建議用給予Silverlight或Flash的上傳組件來替代傳統(tǒng)的FileUpload組件。這類組件不單單提供了更好的上傳體驗,也通常會比<input type="file">在頁面上生成的文本框和按鈕要漂亮一些。這個<input type="file">并不能夠通過CSS添加樣式,雖然總是有人嘗試去尋找一些方法。
雖然目前并沒有什么商業(yè)上傳組件使用了Silverlight,不過我們可以找到一個示例程序演示了用Silverlight進行多文件上傳的方法。
哪怕是如同文件上傳一般微不足道的問題,我們都能夠找到很多種不同的方法來解決。而最大的挑戰(zhàn)在于分析各種不同做法的利弊,以及衡量用各個做法解決這個問題所要花費的時間和金錢。只有仔細分析計劃之后,我們才能夠找到最適合項目中使用的方法。
【編輯推薦】