从URL获取正确的下载文件大小

3

我正在尝试从URL (https://windows.php.net/downloads/releases/php-7.2.9-nts-Win32-VC15-x64.zip) 获取文件大小,以下是我的代码 -

HttpWebRequest request = HttpWebRequest.CreateHttp(url);
HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync());
long length = response.ContentLength;

但是length的值为598字节,而网站(以及从浏览器下载时)报告的大小为24.5MB。我甚至尝试从响应头访问"Content-Length",但它也具有相同的值598

我是否遗漏了什么?是否有其他更准确地获取文件大小的方法?


你可以查看这篇文章:从URL获取文件大小 - omriman12
@omriman12,你链接的帖子讨论了我已经使用过的两种方法,即response.ContentLength和响应头中的“Content-Length”。但在这种特定情况下,它们都返回不正确的长度。 - ac-lap
你看过实际结果吗?如果结果大小是可以理解的,那么它是否可能是重定向到其他地方呢? - Sami Kuhmonen
你是否检查了响应对象的内容类型属性?如果这是一个重定向页面,它将显示“text”并返回该页面的大小(我想这是这种情况),而对于Zip文件,它将显示“zip”。 - A.Learn
@A.Learn,是的,响应对象的ContentType为"text/plain",StatusCode为OK。我尝试将AllowAutoRedirect设置为true和false进行请求,但响应对象相同。那么,我该如何获取最终的下载URL? - ac-lap
1个回答

5

我使用您提供的示例URL,并通过以下方式读取其内容:

var dataStream = response.GetResponseStream();
var reader = new StreamReader(dataStream);
var responseFromServer = reader.ReadToEnd();

我得到的结果如下:

2018年2月20日:您好!我们似乎正在接收来自空用户代理的高请求量。虽然这不应该是一个问题,但不幸的是,这导致此服务器的带宽出现问题,使所有下载都无法使用。因此,我们决定暂时阻止空用户代理,直到我们升级了服务器带宽。

2018年3月3日:我们已经升级了服务器带宽。但是,这仍然不足以处理所有空用户代理连接。请相应地更新脚本中的用户代理或与我们联系,以便我们讨论。

感谢您的理解。

它说设置UserAgent。因此,我将用户代理设置为以下内容:
var request = HttpWebRequest.CreateHttp(url);
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1";
var response = (HttpWebResponse)(await request.GetResponseAsync());
var length = response.ContentLength;

现在,我得到了正确的Content-Length值为25691309
我只是从以下网址中挑选了一个用户代理字符串: http://www.useragentstring.com/index.php?id=19879 如果您只对远程文件的大小感兴趣,您应该考虑链接问题的答案。它本质上使用了不同的HTTP方法(HEAD vs GET)。
        var request = HttpWebRequest.CreateHttp(url);
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1";
        request.Method = "HEAD";
        using (var response = await request.GetResponseAsync())
        {
            var length = response.ContentLength;
        }

您可以在相关问题中找到有关HEAD和GET的更多详细信息: http HEAD vs GET performance

谢谢你的回答。我正在编写文件下载工具,到目前为止我还没有设置UserAgent,我是否应该开始为所有下载设置它?你对此有什么想法? - ac-lap
1
你应该拥有一个独特的UA字符串;不要假装成浏览器,因为你将无法处理HTML、JS等。请参阅此问题获取更多信息。 - Peter Torr - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接