2010-08-17 19 views
7

¿Es posible obtener el tamaño de una imagen (probablemente su tamaño en bytes) desde un servidor web, sin cargarlo?Obtenga el tamaño de una imagen sin cargarla, desde un servidor web

¿Los servidores web tienen propiedades accesibles (campos) con respecto al tamaño de los archivos? Esto permitiría verificar el tamaño de la imagen sin cargar.

A menudo, cuando el directorio de un servidor web se carga en un navegador, le indica el tamaño de cada archivo, desde el lado del servidor. ¿Puedo, como desarrollador ASP, acceder a esos datos?

estoy usando C# .Net 4

Editar: estoy actuando como un cliente y solicitando esta información de otros servidores web.

Apreciar cualquier ayuda, como siempre. Alex

Respuesta

11

¿Quiere decir cuando usted es el servidor o el cliente?

Si usted es el servidor, puede encontrarlo como quiera que pueda encontrarlo sobre cualquier otro archivo (suponiendo que la secuencia de imágenes proviene de un archivo).

new FileInfo(path).Length; 

Si quiere decir que está haciendo el código de cliente (que está accediendo a otro servidor web)

Haz una petición HEAD. Mientras que algunos servidores no se comportan correctamente, la respuesta correcta a un HEAD es prácticamente idéntica a la de un GET, excepto que la entidad no se envía.

Por ejemplo, para obtener el PNG sprites que se utiliza en esta página, el navegador hace un GET para http://sstatic.net/stackoverflow/img/sprites.png lo que resulta en la respuesta:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:06:21 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 
Content-Length: 18607 

seguido por los octetos del archivo de imagen real.

Haciendo una cabeza en lugar de un 'resultados en:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:07:20 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Content-Length: 18607 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 

más o menos la misma pero sin el cuerpo de la entidad. En este punto, podemos ver que la imagen tiene 18607bytes de tamaño, sin realmente descargarla. Sin embargo, este método no funcionará si la imagen se envía fragmentada, ya que la longitud del contenido no se enviará en un encabezado.

Editar:

Vale la pena señalar, que a veces con el contenido fragmentada que no tendrá más remedio que descargar todo el asunto, ya que el servidor no va a decir (y puede que ni siquiera sabe) el tamaño cuando se inicia enviando. Lamentablemente, es probable que también se use con flujos particularmente grandes. Afortunadamente, es poco probable que se use con imágenes.

+0

Estoy actuando como cliente sí. Entonces el FileInfo no funcionará, entonces veo. HEAD info es el camino a seguir, a pesar de las trampas mencionadas aquí. – Alex

+1

¿No te refieres a 18607 bytes de tamaño? – jeffora

+0

LOL. Copié y pegué así que posiblemente no podría escribirlo mal, y luego copié y pegué el máximo de edad por error. Reparado, gracias. –

2
System.IO.FileInfo fi = new System.IO.FileInfo(filepath); 
fi.Length(); 

Psst, sólo una pista: http://www.google.ca/#hl=en&source=hp&q=c%23+get+file+size&aq=f&aqi=g4g-m2&aql=&oq=&gs_rfai=&fp=e6a957a020d2d8f6

Si necesita/quiere hacer esto estrictamente a través de HTTP, usted debe tratar de captar la cabecera Content-Length que viene con la solicitud. Sin embargo, puede que no siempre esté allí, por lo que tendrá que experimentar con eso y asegurarse de que el servidor web indique con precisión la longitud del archivo. Si se trata de una imagen de un script, por ejemplo, puede que falte el encabezado Content-Length (en cuyo caso, la culpa es de alguien).

Si falta la longitud del contenido, entonces estoy bastante seguro de que no hay manera de determinar qué tan grande es el archivo a través de HTTP sin descargarlo. Los encabezados Content-Length se usan exactamente para este tipo de cosas.

+0

.. Noticias fantásticas. Pensé en la comprobación del encabezado HTTP, y lo definiste perfectamente a través de Content-Length. Siempre podemos omitir cualquier información dudosa del encabezado, pero esperamos que la mayor parte del contenido esté disponible. Gracias ... te dejaré saber cómo funciona cuando implemente mañana. ¡Son las 2.16 am aquí! :) – Alex

+0

Lástima de nadie si se envía con 'Transfer-Encoding: Chunked', ya que entonces NO DEBE (en el sentido RFC 2119 de un mayúscula" NO DEBE ") enviarse, y si fue enviado DEBE ser ignorado –

+0

¿System.IO.FileInfo funciona con datos web o solo datos locales? ¿Puede el filepath ser un URI? – Alex

1

Hay muchos servidores web que no sirven al campo Content-Length. Deberá asegurarse de que su código sea tolerante a esto.

Cuestiones relacionadas