Получить размер изображения без загрузки с веб-сервера - PullRequest
8 голосов
/ 17 августа 2010

Можно ли получить размер изображения (вероятно, его размер в байтах) с веб-сервера без его загрузки?

Имеют ли веб-серверы доступные свойства (поля) в отношении размеров файлов?Это позволит проверять размер изображения без загрузки.

Часто, когда каталог веб-сервера загружается в браузер, он сообщает вам размер каждого файла со стороны сервера.Могу ли я как разработчик ASP получить доступ к этим данным вообще?

Я использую C # .Net 4

Редактировать: я выступаю в роли клиента и запрашиваю эту информацию удругие веб-серверы.

Цените любую помощь, как всегда.Alex

Ответы [ 3 ]

11 голосов
/ 17 августа 2010

Вы имеете в виду, когда вы сервер или клиент?

Если вы сервер, вы можете найти его любым другим способом (если предположить, что поток изображений исходит из файла).

new FileInfo(path).Length;

Если вы имеете в виду, что вы делаете клиентский код (вы обращаетесь к другому веб-серверу)

Сделайте запрос HEAD. Хотя некоторые серверы ведут себя неправильно, правильный ответ на HEAD в значительной степени идентичен ответу для GET, за исключением того, что объект не отправляется.

Например, чтобы получить PNG спрайта, который используется на этой странице, браузер выполняет GET для http://sstatic.net/stackoverflow/img/sprites.png, что приводит к ответу:

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

с последующими октетами фактического файла изображения.

Делая ГОЛОВУ вместо получения результатов в:

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

в значительной степени то же самое , но без тела сущности . На данный момент мы видим, что размер изображения составляет 18607 байт, но его фактически не загружают. Однако этот метод не будет работать, если изображение будет отправлено по частям, так как тогда длина содержимого не будет отправлена ​​в заголовке.

Edit:

Стоит отметить, что иногда с кусочным контентом у вас не будет другого выбора, кроме как загрузить все это, потому что сервер не скажет (и может даже не знать) размер, когда он начнет отправлять. К сожалению, это, вероятно, также будет использоваться с особенно большими потоками. К счастью, это вряд ли будет использоваться с изображениями.

2 голосов
/ 17 августа 2010
System.IO.FileInfo fi = new System.IO.FileInfo(filepath);
fi.Length();

Psst, просто подсказка: 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

Если вам нужно / вы хотите сделать это строго через HTTP, вы должны попытаться перехватить заголовок Content-Length, который идет с запросом. Хотя это может быть не всегда, поэтому вам придется поэкспериментировать с этим и убедиться, что веб-сервер точно определяет длину файла. Если это изображение из сценария, например, заголовок Content-Length может отсутствовать (в этом случае позор кому-либо).

Если Content-Length отсутствует, то я почти уверен, что невозможно определить, насколько велик файл по HTTP, без его загрузки. Заголовки Content-Length используются именно для такого рода вещей.

1 голос
/ 23 августа 2010

Есть много веб-серверов, которые не обслуживают поле Content-Length.Вам нужно убедиться, что ваш код терпим к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...