2010-04-11 173 views
3

在我的asp.net項目中,我的主頁接收URL作爲參數,我需要在內部下載然後處理它。我知道我可以使用WebClient的DownloadFile方法,但是我想避免惡意用戶將URL傳遞給一個巨大的文件,這將導致我的服務器不必要的流量。爲了避免這種情況,我正在尋找解決方案來設置DownloadFile將下載的最大文件大小。限制WebClient下載文件最大文件大小

謝謝你在前進,

傑克

+0

最大的下載或上傳的最大範圍內? – Aristos 2010-04-11 09:29:10

+0

@Aristos - 我在說最大的下載量。我的asp.net網頁下載傳遞給它的url。 – 2010-04-11 11:26:56

回答

7

有沒有辦法做到這一點「乾淨」,而無需使用Flash或Silverlight文件上載控件。如果不使用這些方法,最好的做法是在web.config文件中設置maxRequestLength

實施例:

<system.web> 
    <httpRuntime maxRequestLength="1024"/> 

上面的例子將限制文件的大小爲1MB。如果用戶嘗試發送更大的內容,他們將收到一條錯誤消息,指出已超出最大請求長度。這不是一個漂亮的信息,但如果你想要的話,你可以覆蓋IIS中的錯誤頁面,使其與網站可能匹配。

編輯DUE TO評論:

所以你可能使用了幾個方法做的就是從URL中的文件的請求,所以我會發布2個可能的解決方案。首先是使用.NET WebClient

// This will get the file 
WebClient webClient = new WebClient(); 
webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(DownloadCompleted); 
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged); 
webClient.DownloadFileAsync(new Uri("http://www.somewhere.com/test.txt"), @"c:\test.txt"); 

private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    WebClient webClient = (WebClient)(sender); 
    // Cancel download if we are going to download more than we allow 
    if (e.TotalBytesToReceive > iMaxNumberOfBytesToAllow) 
    { 
     webClient.CancelAsync(); 
    } 
} 

private void DownloadCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    // Do something 
} 

另一種方法是做下載來檢查文件大小之前只是做一個基本的Web請求:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://www.somewhere.com/test.txt")); 
webRequest.Credentials = CredentialCache.DefaultCredentials; 
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 
Int64 fileSize = webResponse.ContentLength; 
if (fileSize < iMaxNumberOfBytesToAllow) 
{ 
    // Download the file 
} 

希望這些解決方案或一個幫助至少讓你走上正確的道路。

+0

@凱爾西 - 你的答案是無關的。請重讀這個問題。 – 2010-04-12 19:39:47

+0

@Jack Juiceson - 您使用什麼方法獲取URL?你使用庫來處理文件流? – Kelsey 2010-04-12 21:54:34

+0

感謝您的重新編輯,DownloadProgressChanged的第一個解決方案就是我要做的,這就是我一直在尋找的。關於第一個提出請求的第二個解決方案,我不會使用它,因爲並非始終由服務器提供內容長度標頭。 – 2010-04-13 09:15:12

1
var webClient = new WebClient(); 
client.OpenRead(url); 
Int64 bytesTotal = Convert.ToInt64(client.ResponseHeaders["Content-Length"]); 

那你決定是否bytesTotal是極限