Como obter o tamanho do arquivo de headers http

Eu quero obter o tamanho de um arquivo http: /…/ antes de baixá-lo. O arquivo pode ser uma página da Web, imagem ou um arquivo de mídia. Isso pode ser feito com headers HTTP? Como faço para baixar apenas o header HTTP do arquivo?

Isso pode ser feito com headers HTTP?

Sim, este é o caminho a percorrer. Se as informações forem fornecidas, elas estarão no header como o Content-Length do Content-Length . Note, no entanto, que isso não é necessariamente o caso.

O download somente do header pode ser feito usando uma solicitação HEAD vez de GET . Talvez o seguinte código ajude:

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

Observe a propriedade do comprimento do conteúdo no object HttpWebResponse – não é necessário analisar o header Content-Length manualmente.

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

Observe que nem todo servidor aceita solicitações HTTP HEAD . Uma abordagem alternativa para obter o tamanho do arquivo é fazer uma chamada HTTP GET para o servidor solicitando apenas uma parte do arquivo para manter a resposta pequena e recuperar o tamanho do arquivo dos metadados que são retornados como parte do header do conteúdo da resposta.

O padrão System.Net.Http.HttpClient pode ser usado para fazer isso. O conteúdo parcial é solicitado definindo um intervalo de bytes no header da mensagem de solicitação como:

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

O servidor responde com uma mensagem contendo o intervalo solicitado e o tamanho inteiro do arquivo. Essa informação é retornada no header do conteúdo da resposta ( response.Content.Header ) com a chave “Content-Range”.

Veja um exemplo do intervalo de conteúdo no header do conteúdo da mensagem de resposta:

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

Neste exemplo, o valor do header implica que a resposta contém bytes de 0 a 15 (ou seja, 16 bytes no total) e o arquivo tem 2.328.372 bytes na sua totalidade.

Aqui está uma implementação de amostra deste método:

 public static class HttpClientExtensions { public static async Task 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] (ie, 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); } } } }