在我的asp.net項目中,我的主頁接收URL作爲參數,我需要在內部下載然後處理它。我知道我可以使用WebClient的DownloadFile方法,但是我想避免惡意用戶將URL傳遞給一個巨大的文件,這將導致我的服務器不必要的流量。爲了避免這種情況,我正在尋找解決方案來設置DownloadFile將下載的最大文件大小。限制WebClient下載文件最大文件大小
謝謝你在前進,
傑克
在我的asp.net項目中,我的主頁接收URL作爲參數,我需要在內部下載然後處理它。我知道我可以使用WebClient的DownloadFile方法,但是我想避免惡意用戶將URL傳遞給一個巨大的文件,這將導致我的服務器不必要的流量。爲了避免這種情況,我正在尋找解決方案來設置DownloadFile將下載的最大文件大小。限制WebClient下載文件最大文件大小
謝謝你在前進,
傑克
有沒有辦法做到這一點「乾淨」,而無需使用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
}
希望這些解決方案或一個幫助至少讓你走上正確的道路。
@凱爾西 - 你的答案是無關的。請重讀這個問題。 – 2010-04-12 19:39:47
@Jack Juiceson - 您使用什麼方法獲取URL?你使用庫來處理文件流? – Kelsey 2010-04-12 21:54:34
感謝您的重新編輯,DownloadProgressChanged的第一個解決方案就是我要做的,這就是我一直在尋找的。關於第一個提出請求的第二個解決方案,我不會使用它,因爲並非始終由服務器提供內容長度標頭。 – 2010-04-13 09:15:12
var webClient = new WebClient();
client.OpenRead(url);
Int64 bytesTotal = Convert.ToInt64(client.ResponseHeaders["Content-Length"]);
那你決定是否bytesTotal
是極限
最大的下載或上傳的最大範圍內? – Aristos 2010-04-11 09:29:10
@Aristos - 我在說最大的下載量。我的asp.net網頁下載傳遞給它的url。 – 2010-04-11 11:26:56