Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Форма сокетом
 
 автор: Loneliness   (21.06.2008 в 01:58)   письмо автору
 
 

Подскажите пожалуйста код, отправляющий сокетом на удаленный сервер файл принятый из формы на сайте.
Форма:
 <form action="stena.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="act" value="save_photo">
    <input style="background: white; color:black;" type="file" name="up_photo"></td>                    
       Название фотографии:
    <input  name="txText" size="20"></td>                                    
              Автор:
    <input style="background: white; color:black;" type="text" name="sAvtor" size="20"></td>                    
              
                    <input type="submit" value="Повесить"> 


Перерерыл кучу примеров здесь на форуме, но адаптировать не выходит никак.

   
 
 автор: mihdan   (21.06.2008 в 02:25)   письмо автору
 
   для: Loneliness   (21.06.2008 в 01:58)
 

В чем проблема, что и как пробовали - примеры дайте?

   
 
 автор: Loneliness   (21.06.2008 в 02:29)   письмо автору
 
   для: mihdan   (21.06.2008 в 02:25)
 

Пробовал так:
$host = 'www.host.ru'; 
$port = 80; 
$path = '/stena.php'; 

      $file_name = $_FILES['userfile']['name'];    // the file 
       $tmp_name = $_FILES['userfile']['tmp_name'];    // the file 
       $content_type = $_FILES['userfile']['type'];    // the file mime type 
       $value = ""; 
        
       srand((double)microtime()*1000000); 
       $boundary = "---------------------".substr(md5(rand(0,32000)),0,10); 
        
       // Build the header 
       $header = "POST $path HTTP/1.0\r\n"; 
       $header .= "Host: $host\r\n"; 
       $header .= "Content-type: multipart/form-data, boundary=$boundary\r\n"; 

       // and attach the file 
       $data .= "--$boundary\r\n"; 
       $content_file = join("", file($tmp_name)); 
       $data .="Content-Disposition: form-data; txText=$txText&sAvtor=$sAvtor&act=$act&up_photo=$up_photo\r\n"; 
       $data .= "Content-Type: $content_type\r\n\r\n"; 
       $data .= "".$content_file."\r\n"; 
       $data .="--$boundary--\r\n"; 
       $header .= "Content-length: " . strlen($data) . "\r\n\r\n"; 

       // Open the connection 
       $fp = fsockopen($host, 80); 
       // then just  
       fputs($fp, $header.$data); 
       $line = ""; 
       while (!feof($fp))  
       {  
          $line .= fgets($fp, 1024);  
       } 
       fclose($fp); 

Но явно что-то недоправил как надо, не загружает файлы.Как правильно переделать это конкретно под мою форму?

   
 
 автор: Trianon   (21.06.2008 в 12:15)   письмо автору
 
   для: Loneliness   (21.06.2008 в 02:29)
 

Форму покажите полностью.
Сейчас у Вас в отправке мешанина. Часть полей упакована как application/x-www-urlencoded, в то же время идут попытки создать некое подобие multipart/formdata . Чего, однозначно, в одном запросе быть не должно.

   
 
 автор: Loneliness   (21.06.2008 в 12:45)   письмо автору
 
   для: Trianon   (21.06.2008 в 12:15)
 

Это вся форма
<form action="stena.php" method="POST" enctype="multipart/form-data"> 
    <input type="hidden" name="act" value="save_photo"> 
    <input style="background: white; color:black;" type="file" name="up_photo"></td>                     
       Название фотографии: 
    <input  name="txText" size="20"></td>                                     
              Автор: 
    <input style="background: white; color:black;" type="text" name="sAvtor" size="20"></td>                     
               
                    <input type="submit" value="Повесить"> 

Как мне ее правильно передать?

   
 
 автор: Trianon   (21.06.2008 в 13:06)   письмо автору
 
   для: Loneliness   (21.06.2008 в 12:45)
 

Вся форма завершается тегом </form>

Как-то так.
Content-Type: multipart/form-data; boundary=--separator
Content-Length: длина-тела-запроса

----separator
Content-Disposition: form-data; name="act"

save_photo
----separator
Content-Disposition: form-data; name="up_photo"; filename="1234.jpg"
Content-Type: application/octet-stream

[тело 
фотографии]
----separator
Content-Disposition: form-data; name="txText"

Название фотографии
----separator
Content-Disposition: form-data; name="sAvtor"

Author
----separator--

   
 
 автор: Loneliness   (21.06.2008 в 16:13)   письмо автору
 
   для: Trianon   (21.06.2008 в 13:06)
 

Туплю, возможно, но как-то легче не стало...

   
 
 автор: Loneliness   (21.06.2008 в 20:44)   письмо автору
 
   для: Trianon   (21.06.2008 в 13:06)
 

Пробую так:

if($act == save_photo)
{
$pu = parse_url( 'http://host.ru/stena.php' ); 
$port = isset($pu['port']) ? $pu['port'] : 80; 
$path = isset($pu['path']) ? $pu['path'] : '/'; 
$path = isset($pu['query']) ? $path . '?' . $pu['query'] : $path; 
$host = $pu['host'];

       $file_name = $_FILES['userfile']['name'];    // the file 
       $tmp_name = $_FILES['userfile']['tmp_name'];    // the file 
       $content_type = $_FILES['userfile']['type'];    // the file mime type 

function random_string($len) 

    $chrs = 'AaBbCcDdEeFf0123456789'; 

    for($s = '', $i = 0; $i < $len; $i++) 
    { 
        $s .= $chrs[rand(0, strlen($chrs) - 1)]; 
    } 

    return $s; 


$fp = fsockopen($host, $port, $errno, $errstr, 10) or die(); 


$data = ""; 

$data .= "--separator\r\n"; 
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n"; 
$data .= "$txText\r\n";
$data .= "--separator\r\n"; 
$data .= "Content-Disposition: form-data; name='sAvtor'\r\n\r\n"; 
$data .= "$sAvtor\r\n";  
$data .= "--separator\r\n\r\n"; 

$data .= "--separator\r\n"; 
$data .= "Content-Disposition: form-data; name='up_photo'; filename=''.$file_name.''\r\n"; 
$data .= "Content-Type: application/octet-stream \r\n";
$data .= "--separator--\r\n\r\n"; 

$headers[] = 'POST ' . $path . ' HTTP/1.0'; 
$headers[] = 'Host: ' . $host; 
$headers[] = 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01'; 
$headers[] = 'Content-type: multipart/form-data; boundary=' . $boundary; 
$headers[] = 'Content-Length: ' . strlen($data); 


if($fp) 

    fwrite($fp, implode("\r\n", $headers) . "\r\n" . $data); 

    while(!feof($fp)) echo fread($fp, 1024); 

    fclose($fp); 
}
}

Пишет ответ сервера: .........
Bad Request

Your browser sent a request that this server could not understand.
Request header field is missing ':' separator.
--separator

Что не так, подскажите?

   
 
 автор: Trianon   (21.06.2008 в 21:27)   письмо автору
 
   для: Loneliness   (21.06.2008 в 20:44)
 

1. $boundary Всё же имеет смысл а) вычислить и б) указать в качестве separator, как сделано у Вас в исходном варианте.
2. Вместо кавычек в content-disposition ... filename= у Вас почему-то стоят пары апострофов.
3. содержимое файла Вы куда-то подевали.
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name='up_photo'; filename=\"$file_name\"\r\n"; 
$data .= "Content-Type: application/octet-stream \r\n\r\n";
$data .= "$content_file\r\n"; 
$data .= "--$boundary--\r\n\r\n"; 

В исходном варианте оно у Вас читалось конструкцией $content_file = join("", file($tmp_name));
4. Между полями sAvtor и up_photo затесалась какая-то пустая секция.


Общий совет. Чем терроризировать через fsockopen чужой сервер кривыми запросами, лучше сперва выводите весь запрос в файл. Или хотя бы на экран. Когда отладите формирование запроса - вернете fsockopen.
Как выглядят HTTP-запросы, можно поглядеть через httpheaders-плагины к браузеру - если лениво изучать документацию.

   
 
 автор: Loneliness   (21.06.2008 в 23:20)   письмо автору
 
   для: Trianon   (21.06.2008 в 21:27)
 

В том и дело, что я уже до того затерроризировал своими кривыми запросами не менее кривой скрипт на удаленном сервере, что затер каким-то образом начисто все сообщения с их гребаной доски... :-( Если так продолжится, я скоро вообще сайт им в даун вынесу нечаянно своими запросами..

   
 
 автор: Trianon   (21.06.2008 в 23:32)   письмо автору
 
   для: Loneliness   (21.06.2008 в 23:20)
 

Что ж... Вы, похоже, человек редких талантов :)

Доиграетесь до того, что Ваш ip просто напросто забанят.
Какой смысл использовать в качестве тестера сервер, если то же самое можно сделать собственными глазами. И ошибки так определятся куда быстрей.

   
 
 автор: Loneliness   (21.06.2008 в 23:56)   письмо автору
 
   для: Trianon   (21.06.2008 в 23:32)
 

Дело прошлое, я настолько слабо представляю себе правильный HTTP запрос в данном случае, что визуально долго буду понимать, что к чему. Остается старый-добрый метод тыка. Да и пусть банят тестовый сервер, еще есть в запасе пару хостов, и окончательный вариант буду через анонимайзер делать.
С другой стороны, им и смысла меня банить нет- я им от себя буду визуальное движение в чате значительно оживлять своими пользователями, медиа базу их чата пополнять будут дополнительно также мои пользователи...
В общем, Enjoy полнейший для обеих сторон.
Единственное, что из-за моих навредивших запросов, может решат что я им бяку делаю...:(

   
 
 автор: Loneliness   (21.06.2008 в 23:32)   письмо автору
 
   для: Trianon   (21.06.2008 в 21:27)
 

$host = 'host.ru';  
$path = '/stena.php'; 
    

       $file_name = $_FILES['userfile']['name'];    // the file 
       $tmp_name = $_FILES['userfile']['tmp_name'];    // the file 
       $content_type = $_FILES['userfile']['type'];    // the file mime type 
       $content_file = join("", file($tmp_name));

        srand((double)microtime()*1000000); 
       $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);

$fp = fsockopen($host, 80) or die(); 


$data = ""; 

$data .= "--$boundary"; 
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n"; 
$data .= "$txText\r\n";
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name='sAvtor'\r\n\r\n"; 
$data .= "$sAvtor\r\n";
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name='act'\r\n\r\n"; 
$data .= "$act\r\n";    
$data .= "--$boundary\r\n\r\n"; 
$data .= "Content-Disposition: form-data; name='up_photo'; filename="$file_name"\r\n"; 
$data .= "Content-Type: application/octet-stream\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n\r\n"; 

$header = "POST $path HTTP/1.0\r\n"; 
$header .= "Host: $host\r\n"; 
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
$header .= 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01'; 
$header .= 'Content-Length: ' . strlen($data); 


if($fp) 

    fwrite($fp,$header.$data); 
    $line="";
    while(!feof($fp)) echo fread($fp, 1024); 

    fclose($fp); 
}

Так правильно будет? И скажите, выделенная жирным часть кода $header .= 'Content-Length: ' . strlen($data); правильно построена, Не нужно ли в этот заголовок и размер файла вписывать как либо? Заранее благодарю.

   
 
 автор: BinLaden   (22.06.2008 в 01:05)   письмо автору
 
   для: Loneliness   (21.06.2008 в 23:32)
 

Всё-таки лучше заменить апострофы на кавычки:

> $data .= "Content-Disposition: form-data; name=\"txText\"\r\n\r\n";

и т.д. В документации про апострофы вроде ничего не сказано. Хотя вполне возможно, что с большинством серверов работать будет и так. Но расчитывать на такое не стоит.

   
 
 автор: Loneliness   (21.06.2008 в 10:56)   письмо автору
 
   для: mihdan   (21.06.2008 в 02:25)
 

На последний вариант кода их сервер реагирует нормально вроде, строкой:
HTTP/1.1 200 OK Date: Sat, 21 Jun 2008 19:45:14 GMT Server: Apache/2.0.54 (Linux/SUSE) X-Powered-By: PHP/4.4.0 Content-Length: 6333 Connection: close Content-Type: text/html
Однако помимо этого выдает ошибку:
Warning: join() [function.join]: Invalid arguments passed in /home/loneliness/domains/..../public_html//stena.php on line 86
В чем может причина скрываться? Какова вообще структура функции join? Как она работает?

   
 
 автор: BinLaden   (22.06.2008 в 01:00)   письмо автору
 
   для: Loneliness   (21.06.2008 в 10:56)
 

> Warning: join() [function.join]: Invalid arguments passed in /home/loneliness/domains/..../public_html//stena.php on line 86
> В чем может причина скрываться? Какова вообще структура функции join? Как она работает?

Только на join() выдаёт ошибку? Странно. По идее, если file() не может получить содержимое файла, то тоже генерирует ошибку типа Warning.

В любом случае, замените это на $content_file = file_get_contents($tmp_name);

   
 
 автор: Loneliness   (22.06.2008 в 01:29)   письмо автору
 
   для: BinLaden   (22.06.2008 в 01:00)
 

Запрос наконец таки принял успешно, несмотря на апострофы, в принципе, но поменял на кавычки.
Вот до чего докодился:

$host = 'host.ru';  
$path = '/stena.php'; 
    

       $file_name = $_FILES['up_photo']['name'];    // the file 
       $tmp_name = $_FILES['up_photo']['tmp_name'];    // the file 
       $content_type = $_FILES['up_photo']['type'];    // the file mime type 
       $content_file = file_get_contents($tmp_name);

        srand((double)microtime()*1000000); 
       $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);

$fp = fsockopen($host, 80) or die(); 


$data = ""; 

$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name='txText'\r\n\r\n"; 
$data .= "$txText\r\n";
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name=\"sAvtor\" \r\n\r\n"; 
$data .= "$sAvtor\r\n";
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name=\"act\"\r\n\r\n"; 
$data .= "$act\r\n";    
$data .= "--$boundary\r\n"; 
$data .= "Content-Disposition: form-data; name=\"up_photo\"; filename='"$file_name\r\n"; 
$data .= "Content-Type: $content_type\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n"; 
$content_lenght = strlen($data);
$header = "POST $path HTTP/1.0\r\n"; 
$header .= "Host: $host\r\n"; 
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01\r\n"; 
$header .= "Content-Length: $content_lenght\r\n\r\n"; 

if($fp) 

    fwrite($fp,$header.$data); 
    $line="";
   while(!feof($fp)) echo fread($fp, 1024); 

   fclose($fp); 
}

Получаю в ответ Ошибка! Неподдерживаемый тип файла Хотя та же фота напрямую из формы на удаленном сервере загружается нормально. В чем косяк у меня?

   
 
 автор: Trianon   (22.06.2008 в 13:21)   письмо автору
 
   для: Loneliness   (22.06.2008 в 01:29)
 

$data .= "--$boundary\r\n";  
$data .= "Content-Disposition: form-data; name=\"up_photo\"; filename=\"$file_name\"\r\n"; 
$data .= "Content-Type: $content_type\r\n\r\n";
$data .= "$content_file\r\n";
$data .= "--$boundary--\r\n"; 

   
 
 автор: Loneliness   (22.06.2008 в 13:42)   письмо автору
 
   для: Trianon   (22.06.2008 в 13:21)
 

Великолепно!!! Огромное спасибо за посильную помощь в моем немного черном деле внедрения в чужой чат. Обещаю не использовать во вред.
P.S Теперь формы сокетами отправлять умею точно :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования