Как получить размер файла с заголовков http


56

Я хочу получить размер файла http: /.../ перед его загрузкой. Файл может быть веб-страницей, изображением или медиа-файлом. Это можно сделать с помощью HTTP-заголовков? Как загрузить только HTTP-заголовок файла?

84

Да, предполагая, что сервер HTTP вы говорите носителям/это позволяет:

System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://stackoverflow.com/robots.txt"); 
req.Method = "HEAD"; 
using (System.Net.WebResponse resp = req.GetResponse()) 
{ 
    int ContentLength; 
    if(int.TryParse(resp.Headers.Get("Content-Length"), out ContentLength)) 
    { 
     //Do something useful with ContentLength here 
    } 
} 

При использовании метода HEAD, не допускается, или заголовок Content-Length не присутствует в ответе сервера, единственный способ определить размер содержимого на сервере - загрузить его. Поскольку это не особенно надежно, большинство серверов будут включать эту информацию.

+11

Если вы используете 'using', он автоматически удаляет его. http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx 16 апр. 132013-04-16 20:12:14

+2

Другое примечание: если вы используете это для чрезвычайно больших файлов, 'int' недостаточно, вам понадобится использовать 'long ContentLength;' и 'long.TryParse (xxx)' для поддержки более чем возвращаемого значения размера 2,14 ГБ. 16 окт. 152015-10-16 04:27:33

  0

Не разрешено ли сжатие http с фактическим размером файла? 17 июл. 162016-07-17 23:06:01


25

Можно ли это сделать с помощью 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 вручную.

  0

Не будет ли 'resp.ContentLength' выше дать вам длину ответа HEAD, а не длину файла, который вам интересен при получении sizeof? 19 апр. 112011-04-19 12:47:28

+1

@Adam No. В документации указано: «Свойство ContentLength содержит значение заголовка Content-Length, возвращенного с ответом». 19 апр. 112011-04-19 12:57:06

+1

Исправить, спасибо Konrad. 20 апр. 112011-04-20 12:15:05

  0

Убедитесь, что вы вызываете resp.Close(), или вы можете столкнуться с ошибками таймаута при одновременном выполнении нескольких запросов (мой третий запрос был тайм-аут в цикле foreach, который был решен путем закрытия каждого ответа) 25 мар. 132013-03-25 20:56:43

+2

@ Эрик На самом деле вы должны используйте здесь блок «Использовать» или реализуйте одноразовый шаблон для явного управления временем жизни ресурса. Ручного вызова 'Close' недостаточно, если вы не убедитесь, что он * всегда *, даже в случае ошибки. 25 мар. 132013-03-25 20:59:32

  0

@ KonradRudolph Вы абсолютно правы. Вызов Close() исправил мою ошибку, пока я тестировал это, но использование блока - правильный способ сделать это. Derp. 26 мар. 132013-03-26 00:59:02

  0

@KonradRudolph, FYI, 'ContentLength' возвращает' long'. Неважно, но на всякий случай вы хотите это исправить. 02 май. 132013-05-02 00:14:08


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