2010-04-11 3 views
3

В моем проекте asp .net моя главная страница получает URL-адрес в качестве параметра, который мне нужно загрузить внутри, а затем обработать его. Я знаю, что я могу использовать метод DownloadFile для WebClient, однако я хочу, чтобы злоумышленник не выдавал URL-адрес огромному файлу, что будет излишним трафиком с моего сервера. Чтобы этого избежать, я ищу решение установить максимальный размер файла, который будет загружен DownloadFile.Limit WebClient DownloadFile Максимальный размер файла

Спасибо заранее,

Джека

+0

максимум загрузки или максимальной загрузки? – Aristos

+0

@Aristos - Я говорю о максимальной загрузке. Моя страница asp .net загружает URL-адрес, который передается ему. –

ответ

7

Там нет никакого способа сделать это «чисто», без использования функции управления загрузкой флэша или файла Silverlight. Лучшее, что вы можете сделать, не используя эти методы, - установить maxRequestLength в файле web.config.

Пример:

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

В приведенном выше примере будет ограничивать размер файла до 1 Мбайт. Если пользователь пытается отправить что-либо большее, он получит сообщение об ошибке, указывающее, что максимальная длина запроса превышена. Это не очень приятное сообщение, но если вы хотите, вы можете переопределить страницу ошибок в IIS, чтобы она соответствовала вашему сайту.

EDIT БЛАГОДАРЯ COMMENT:

Так ваш, вероятно, используя несколько методов, чтобы сделать запрос, чтобы получить файл с 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 
} 

Другой метод должен был просто сделать основной веб-запрос, прежде чем делать загрузку, чтобы проверить размер файла:

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

@ Kelsey - ваш ответ не связан. Пожалуйста, перечитайте вопрос. –

+0

@Jack Juiceson - Какой метод вы используете для получения URL-адреса? Используете ли вы библиотеку для обработки потоковой передачи файлов? – Kelsey

+0

спасибо за повторное редактирование, первое решение с DownloadProgressChanged - это то, с чем я буду работать, это то, что я искал. Что касается второго решения, предлагающего сначала выполнить запрос, я его не буду использовать, поскольку сервер не всегда заголовок длины содержимого. –

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

Тогда вы решите, если bytesTotal находится в пределах