限制WebClient DownloadFile最大文件大小

时间:2010-04-11 07:51:24

标签: .net asp.net http webclient

在我的asp .net项目中,我的主页接收URL作为我需要在内部下载然后处理它的参数。我知道我可以使用WebClient的DownloadFile方法但是我想避免恶意用户给一个巨大的文件提供一个url,这将导致来自我服务器的不必要的流量。为了避免这种情况,我正在寻找一种解决方案来设置DownloadFile将下载的最大文件大小。

提前谢谢你,

杰克

2 个答案:

答案 0 :(得分:7)

如果不使用闪存或silverlight文件上传控件,则无法“干净地”执行此操作。不使用这些方法可以做的最好的事情是在web.config文件中设置maxRequestLength

示例:

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

上面的示例将文件大小限制为1MB。如果用户尝试发送任何更大的内容,他们将收到一条错误消息,指出已超出最大请求长度。这不是一个漂亮的消息,但如果你想,你可以覆盖IIS中的错误页面,使其与你的网站匹配。

根据评论编辑:

所以你可能会使用几种方法来处理从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
}

希望其中一个解决方案有助于或至少让您走上正确的道路。

答案 1 :(得分:1)

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

然后您决定bytesTotal是否在限制范围内