首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从http头文件中获取文件大小

如何从http头文件中获取文件大小
EN

Stack Overflow用户
提问于 2008-09-23 18:31:43
回答 3查看 58.8K关注 0票数 69

我想在下载之前获得http:/.../文件的大小。该文件可以是网页、图像或媒体文件。这可以通过HTTP报头来实现吗?如何只下载文件的HTTP头?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-23 18:49:26

是的,假设您正在与之交谈的HTTP服务器支持/允许以下内容:

代码语言:javascript
复制
public long GetFileSize(string url)
{
    long result = -1;

    System.Net.WebRequest req = System.Net.WebRequest.Create(url);
    req.Method = "HEAD";
    using (System.Net.WebResponse resp = req.GetResponse())
    {
        if (long.TryParse(resp.Headers.Get("Content-Length"), out long ContentLength))
        {
            result = ContentLength;
        }
    }

    return result;
}

如果不允许使用HEAD方法,或者服务器回复中没有Content-Length报头,则确定服务器上内容大小的唯一方法是下载它。由于这不是特别可靠,因此大多数服务器都会包含此信息。

票数 98
EN

Stack Overflow用户

发布于 2018-07-18 11:28:27

请注意,并非每台服务器都接受HTTP HEAD请求。获取文件大小的另一种方法是对服务器进行HTTP GET调用,仅请求文件的一部分以保持响应较小,并从作为响应内容头的一部分返回的元数据中检索文件大小。

可以使用标准的System.Net.Http.HttpClient来实现这一点。通过在请求消息头上设置字节范围来请求部分内容:

代码语言:javascript
复制
    request.Headers.Range = new RangeHeaderValue(startByte, endByte)

服务器返回一条消息,其中包含请求的范围以及整个文件大小。此信息在响应内容头部(response.Content.Header)中返回,关键字为content -Range。

以下是响应消息内容头中的内容范围的示例:

代码语言:javascript
复制
    {
       "Key": "Content-Range",
       "Value": [
         "bytes 0-15/2328372"
       ]
    }

在此示例中,标头值意味着响应包含字节0到15 (即,总共16字节),并且文件的整体长度为2,328,372字节。

下面是该方法的一个示例实现:

代码语言:javascript
复制
public static class HttpClientExtensions
{
    public static async Task<long> GetContentSizeAsync(this System.Net.Http.HttpClient client, string url)
    {
        using (var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url))
        {
            // In order to keep the response as small as possible, set the requested byte range to [0,0] (i.e., only the first byte)
            request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(from: 0, to: 0);

            using (var response = await client.SendAsync(request))
            {
                response.EnsureSuccessStatusCode();

                if (response.StatusCode != System.Net.HttpStatusCode.PartialContent) 
                    throw new System.Net.WebException($"expected partial content response ({System.Net.HttpStatusCode.PartialContent}), instead received: {response.StatusCode}");

                var contentRange = response.Content.Headers.GetValues(@"Content-Range").Single();
                var lengthString = System.Text.RegularExpressions.Regex.Match(contentRange, @"(?<=^bytes\s[0-9]+\-[0-9]+/)[0-9]+$").Value;
                return long.Parse(lengthString);
            }
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-10-29 19:42:50

代码语言:javascript
复制
WebClient webClient = new WebClient();
webClient.OpenRead("http://stackoverflow.com/robots.txt");
long totalSizeBytes= Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);
Console.WriteLine((totalSizeBytes));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/122853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档