Следующая статья: Как отправить письмо / почту / email в PHP?
Надеюсь, все уже изучили пример отправки сообщения на ICQ, которая демонстрирует 2 вещи: работа с сокетами (послали команду, считали ответ - точно также, как читать из файла) и отправка POST запросов (генерация параметров, кодирование, вставка переменных в POST запрос).
Здесь тоже самое: открываем сокет, шлем GET форму, читаем ответ. Ответ состоит из 2х вещей: заголовок и тело документа. Так как название данной статьи - получение файла, то очевидно, нас наиболее волнует именно тело документа (то есть, файл), а не все, что выдаст сервер. Тело от заголовка отделено строкой «\r\n».
Чтобы применить программу, замените строку «php.spb.ru» на имя вебсервера в 2х местах. Затем замените «/files/notepad.exe» на путь к файлу… В конце программы вместо «download.tmp» укажите, куда поместить скаченный файл (и надо ли его вообще в файл записывать)
<?php
$so=fsockopen('php.spb.ru',80,&$errno,&$errstr,30);// открыли соединение
// послали GET форму (простой URL + указание вирт. хоста)
fputs($so,'GET /files/notepad.exe HTTP/1.0'."\n".'HOST: php.spb.ru'."\n\n");
// читаем все, пока не наступит «конец заголовка» (то есть, начало документа)
// если наступит, то со след. байта начнется документ
while(fgets($so,2048)!="\r\n" &&!feof($so));
unset($buf);
while(!feof($so)) { $buf.=fread($so,2048); }// читаем документ в переменную
// Готово. В переменной $buf храниться скаченный документ (то есть, файл)
// Максимум можно читать порциями по 64K-1байт
fclose($so);// закрываем сокет
echo 'Download fine, size '.strlen($buf).' bytes.'; flush();
$f=fopen('download.tmp','wb+');// используем скаченный файл (в переменной) по назначению…
fwrite($f,$buf,strlen($buf));
fclose($f);
?>
Не забываем читать бинарные данные из сокета функций fread, а заголовок - текстовой функцией fgets. Можно все читать fread, но fgets нас избавит от не простого поиска пустой строки, отделяющей заголовок от тела.
Для записи файла открываем его в режиме wb+, если файла не было - создать, если был - урезать до 0 байт (w), открыть в режиме бинарной записи (b).