Консультация № 140064
16.07.2008, 02:15
0.00 руб.
0 6 1
Как определить размер файла по http адресу? Всегда ли это можно сделать?

Обсуждение

Неизвестный
16.07.2008, 02:37
общий
это ответ
Здравствуйте, Fenixk19!
Как определить размер файла по http адресу?
Размер файла приходит в заголовке ответа сервера:

GET http://www.radiokot.ru/start/mcu_fpga/avr/15/01.gif HTTP/1.0
User-Agent: NOD32 Update (Windows; U; 32bit; VDB 9806; BPC 2.70.39; OS: 5.1.2600 SP 2.0 NT;CH 0.0;LNG RUSSIAN;x32c)
Host: radiokot.ru
Connection: close
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.0 200 OK
Server=nginx/0.5.36
Date=Tue, 15 Jul 2008 22:23:09 GMT
Content-Type=image/gif
<b><font color=red>Content-Length=13403</font></b>
Last-Modified=Thu, 08 Dec 1985 01:29:27 GMT
Accept-Ranges=bytes
X-Cache=MISS from proxy.oreol.net
X-Cache-Lookup=MISS from proxy.oreol.net:3128
Via=1.0 proxy.oreol.net:3128 (squid/2.6.STABLE12)
Connection=keep-alive
proxy-connection=keep-alive

Всегда ли это можно сделать?
Нет. Не все серверы передают в заголовке размер.

В приложении простенький скрипт получения размера.

Приложение:
<?php$QUERY = "HEAD http://www.radiokot.ru/start/mcu_fpga/avr/15/01.gif HTTP/1.0\r\n";$QUERY .= "Host: radiokot.ru\r\n";$QUERY .= "Connection: close\r\n\r\n";$header = "";$fp = fsockopen("radiokot.ru",80,$errno,$errstr,30);fwrite($fp,$QUERY);while(!feof($fp)) $header .= fgets($fp,512);fclose($fp);preg_match("/Content-Length: ([0-9]+)\r\n/i",$header,$matches);$out = (empty($matches[1])) ? "Error" : "Size: ".$matches[1]." b";echo $out;?>
Неизвестный
16.07.2008, 02:38
общий
Начиная со строки HTTP/1.0 200 OK это уже ответ сервера.
Неизвестный
16.07.2008, 02:54
общий
А от чего зависит тип окончания строки? От типа хоста или от типа машины php?

Уточните вопрос
Неизвестный
16.07.2008, 03:00
общий
Простите, действительно получилось расплывчато :)
Вы использовали в запросе окончание строки \r\n. Это какая-то спецификация? Просто я пишу на Linux машине, а такие окончания, насколько я знаю, использует Windows.
Неизвестный
16.07.2008, 03:15
общий
Да, в спецификации используется именно \r\n (CRLF)

Перевод спецификации HTTP, RFC 2068
Неизвестный
16.07.2008, 03:17
общий
Спасибо. Код проверил, код работает. Только вот урлы с пробелами не обрабатывал, но это было несложно исправить.
Форма ответа