|
|
|
| Ответ 002 на задачу N 13.
С условиями задачи можно ознакомится по ссылке.
<?
###########################################
############# task12.php ##################
############# Scripting by DDK ############
###########################################
if(isset($_GET['do']) && isset($_POST['adress']) && !empty($_POST['adress'])) {
$filepath = trim($_POST['adress']);
// Делим путь к файлу на хост и "хвост" (для сокетов)
preg_match('/\\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $filepath, $path_details);
// Проверяем, верен ли введённый адрес
if(isset($path_details[2]) && !empty($path_details[2]))
{
$filehost = $path_details[2];
}
else
{
echo "Введённый адрес некорректен !";
exit;
}
// Если "хвост" пуст, заполняем пустоту слешем, что бы не сглючили сокеты
if(isset($path_details[3]) && !empty($path_details[3])) $filepath = $path_details[3]; else $filepath = "/";
####################################################################################################
############################ Основная часть скрипта, остальное - "вода" :) #########################
####################################################################################################
// Подключаемся к файлу через сокеты
$getfile = fsockopen($filehost, 80, &$errno, &$errstr, 30) or die("Ошибка подключения к серверу");
// Добавляем в буффер путь к файлу на сервере и сам хост
fputs($getfile, "HEAD $filepath HTTP/1.0\nHOST: $filehost\n\n");
// Объявляенм буффер-переменную для заголовков
$temp_headers = "";
// Читаем заголовки по 4 кб, пока не дойдём до конца сокет-файла
WHILE (!feof($getfile)) $temp_headers .= fgets($getfile, 4096);
// Ищем в полученных заголовках Content-Length, если находим,читаем его значение
if(ereg("Content-Length: ([0-9]+)", $temp_headers, $matched_array))
{
echo "Размер файла: ".number_format($matched_array[1], 0, "'", " ")." байт";
}
else
{
echo "Не могу определить размер этого файла :(";
}
// Закрываем сокет-файла
fclose($getfile);
####################################################################################################
####################################################################################################
####################################################################################################
} else {
echo '<br><br><center><form action="'.$HTTP_SERVER_VARS['PHP_SELF'].'?do" method="post">
Путь к удалённому файлу:<br><br>
<input type="Text" name="adress" size="40">
<input type="Submit" value="Узнать размер">
</form></center>';
}
?>
|
http://www.softtime.ru/info/task.php?id_article=83 | |
|
|
|
|
|
|
|
для: SoftTime
(20.03.2006 в 17:28)
| | Работает. Ход с HEAD очень хитрый и хороший - в этом случае тело запроса не грузится и не нужно отслеживать лишний перевод строки между HTTP-заголовками и телом запроса. | |
|
|
|