Cómo obtener el tamaño de archivo de los encabezados http


56

Deseo obtener el tamaño de un archivo http: /.../ antes de descargarlo. El archivo puede ser una página web, una imagen o un archivo multimedia. ¿Se puede hacer esto con los encabezados HTTP? ¿Cómo descargo solo el encabezado HTTP del archivo?

84

Sí, suponiendo que el servidor HTTP que está hablando soportes/permite esto:

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

Si no está permitido usar el método HEAD, o la cabecera Content-Length no está presente en la respuesta del servidor, la única forma de determinar el tamaño del contenido en el servidor es descargarlo. Como esto no es particularmente confiable, la mayoría de los servidores incluirán esta información.

+11

Si usa 'using', lo descarta automáticamente. http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx 16 abr. 132013-04-16 20:12:14

+2

Otra nota, si está utilizando esto para archivos extremadamente grandes 'int' no es suficiente, necesitará para usar 'long ContentLength;' y 'long.TryParse (xxx)' para admitir más de un valor de retorno de 2.14GB de tamaño. 16 oct. 152015-10-16 04:27:33

  0

¿No se habilitará la compresión http para eliminar el tamaño real del archivo? 17 jul. 162016-07-17 23:06:01


25

¿Se puede hacer esto con los encabezados HTTP?

Sí, este es el camino a seguir. Si se proporciona la información, está en el encabezado como Content-Length. Tenga en cuenta, sin embargo, que este no es necesariamente el caso.

Descargando solo el encabezado se puede hacer utilizando una solicitud HEAD en lugar de GET. Tal vez el código siguiente ayuda:

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

Aviso la propiedad de la longitud del contenido en el objeto HttpWebResponse - no hay necesidad de analizar la cabecera Content-Length manualmente.

  0

¿No 'resp.ContentLength' anterior le dará la longitud de la respuesta HEAD, y no la longitud del archivo que le interesaba obtener la sizeof? 19 abr. 112011-04-19 12:47:28

+1

@ Adam No. La documentación dice: "La propiedad ContentLength contiene el valor del encabezado Content-Length devuelto con la respuesta". 19 abr. 112011-04-19 12:57:06

+1

Correcto, gracias, Konrad. 20 abr. 112011-04-20 12:15:05

  0

Asegúrese de llamar a resp.Close() o puede encontrar errores de tiempo de espera al hacer varias solicitudes a la vez (mi tercera solicitud se agotó en un bucle foreach que se resolvió al cerrar cada respuesta) 25 mar. 132013-03-25 20:56:43

+2

@Eric De hecho, debería utilice un bloque 'Using' aquí, o implemente el patrón desechable para administrar la vida útil del recurso de forma explícita. Llamar manualmente 'Cerrar' no es suficiente a menos que asegure que * siempre * sucede, incluso en el caso de error. 25 mar. 132013-03-25 20:59:32

  0

@KonradRudolph Tienes toda la razón. Llamar a Close() solucionó mi error mientras yo estaba probando esto, pero un bloque de uso es la forma correcta de hacerlo. Derp. 26 mar. 132013-03-26 00:59:02

  0

@KonradRudolph, FYI, 'ContentLength' devuelve un' long'. No es un gran problema, pero en caso de que quiera arreglarlo. 02 may. 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));