如何从HTTP头获取文件大小(How to get the file size from http

2019-06-18 00:52发布

我想获得一个http大小:以前我下载/.../文件。 该文件可以是网页,图像,或媒体文件。 可这与HTTP头做什么? 我怎么下载只是文件HTTP标头?

Answer 1:

是的,假设你在跟谁说话支持HTTP服务器/允许这样的:

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头中不存在的服务器的答复,以确定在服务器上的内容的大小的唯一方法是下载它。 由于这不是特别可靠,大多数服务器将包括此信息。



Answer 2:

可这与HTTP头做什么?

是的,这是要走的路。 如果提供的信息,它在头部的Content-Length 。 但是请注意,这不是必然的情况。

仅下载报头可以使用来完成HEAD请求而不是GET 。 也许下面的代码帮助:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com/");
req.Method = "HEAD";
long len;
using(HttpWebResponse resp = (HttpWebResponse)(req.GetResponse()))
{
    len = resp.ContentLength;
}

注意对于上的内容长度的属性HttpWebResponse对象-无需解析Content-Length手动头。



Answer 3:

WebClient webClient = new WebClient();
webClient.OpenRead("http://stackoverflow.com/robots.txt");
long totalSizeBytes= Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);
Console.WriteLine((totalSizeBytes));


Answer 4:

请注意,并非所有的服务器接受HTTP HEAD请求。 一种替代的方法来获取文件大小是使一个HTTP GET请求只有文件的一部分,以保持反应小和检索被作为响应返回内容头的一部分的元数据文件大小调用服务器。

该标准System.Net.Http.HttpClient可以用来实现这一目标。 部分内容是通过设置在所述请求消息报头作为一个字节范围请求:

    request.Headers.Range = new RangeHeaderValue(startByte, endByte)

服务器以包含所请求的范围的信息以及整个文件大小进行响应。 此信息在响应内容首部(返回response.Content.Header )与键“内容范围”。

下面是在响应消息中内容首部的内容的范围的一个例子:

    {
       "Key": "Content-Range",
       "Value": [
         "bytes 0-15/2328372"
       ]
    }

在这个例子中头值意味着响应包含字节0到15(即,16个字节的总)和文件是其全部2328372个字节。

下面是该方法的实现:

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);
            }
        }
    }
}


文章来源: How to get the file size from http headers