【问题标题】:Getting correct download file size from url从 url 获取正确的下载文件大小
【发布时间】:2019-02-01 07:15:31
【问题描述】:

我正在尝试从 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 bytes,而网站(以及从浏览器下载时)报告的大小为24.5MB。我什至尝试从响应头访问"Content-Length",但它也有相同的值598

我错过了什么吗?有没有其他方法可以更准确地获取文件大小?

【问题讨论】:

  • 你可以查看这个帖子:file size from url
  • @omriman12,您链接的帖子讨论了我已经使用的 2 种方法,response.ContentLength 和响应标头中的“Content-Length”。在这种特定情况下,它们都返回不正确的长度。
  • 你看过实际的结果是什么了吗?当结果大小可以理解时,它是否会重定向到其他地方?
  • 您是否检查了响应对象的内容类型属性...如果这是一个重定向页面,它将显示“文本”并返回该页面的大小(我认为是这种情况)而对于 zip 文件,它将显示“zip”
  • @A.Learn,是的,响应对象的 ContentType 是“text/plain”,并且 StatusCode 是好的。我尝试使用 AllowAutoRedirect 向 true 和 false 发出请求,但响应对象是相同的。那么,如何获得最终的下载地址呢?

标签: c# .net http download uwp


【解决方案1】:

我使用了您的示例 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-Length25691309

我刚刚从以下位置选择了一个用户代理字符串: http://www.useragentstring.com/index.php?id=19879

如果您只是对远程文件的大小感兴趣,则应考虑链接问题的答案。它本质上使用了不同的 HTTP 方法(HEAD 与 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 Vs GET 的更多详细信息: http HEAD vs GET performance

【讨论】:

  • 感谢您的回答。我正在编写文件下载工具,直到现在我还没有设置 UserAgent,我应该开始为所有下载设置它吗?您对此有何看法。
  • 你应该有一个唯一的UA字符串;不要假装自己是浏览器,因为您将无法处理 HTML、JS 等。请参阅this question 了解更多信息。
猜你喜欢
  • 2015-02-20
  • 2011-03-12
  • 2020-07-19
  • 2017-10-03
  • 1970-01-01
  • 2013-06-29
  • 2012-06-15
  • 2018-05-08
相关资源
最近更新 更多