Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Файл аплоад - boundary. Need help! (php)
цитата
05/04/07 в 15:48
 Lamagro
Сабдж собственно.
Пытаюсь отправить файлы пхп скриптом. Неполучается.
Может кто чего подскажет?

Вот что отправляет браузер:
Код:
POST /cgi-bin/user_uploads.cgi HTTP/1.1
User-Agent: Opera/9.10 (Windows NT 5.1; U; ru)
Host: host.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru,en;q=0.9
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: gzip, deflate
Referer: http://host.com/cgi-bin/user_uploads.cgi
Cookie: hfuser=tabl||checked|||
Cookie2: $Version=1
TE: deflate, gzip, chunked, identity, trailers
Content-Length: 21270
Content-Type: multipart/form-data; boundary=----------GcH7GgPSnXRcsyciRUqJFA
Connection: keep-alive
Posting 21270 bytes...
------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="account"

tabl
------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="session"

YsEzUbBRdW5QNWH
------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="dir"


------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="file1"; filename="file1.html"
Content-Type: text/html

<html> бла бла бла бла тело файла </html>
------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="file2"; filename=""
.......................
.......................
.......................
.......................
------------GcH7GgPSnXRcsyciRUqJFA
Content-Disposition: form-data; name="upload"

Upload these files
------------GcH7GgPSnXRcsyciRUqJFA--


а вот что отправляет мой скрипт

Код:
POST /cgi-bin/user_uploads.cgi HTTP/1.1
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Encoding: deflate
TE: deflate
Accept-Language: en-us
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Cookie: hfuser=tabl||checked|||
Cookie2: $Version=1
Content-Type: multipart/form-data; boundary=------------dYoBnRd189g2BFufzLmOdjSh
Connection: Keep-Alive
Host: host.com
Referer: http://host.com/cgi-bin/user_uploads.cgi
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Content-length: 143489

------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="account"

tabl
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="session"

xvfgNfjkTC1exxA
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="dir"


------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="file1"; filename="file1.html"
Content-Type: text/html

<html> бла бла бла бла тело файла </html>
------------dYoBnRd189g2BFufzLmOdjSh
.......................
.......................
.......................
.......................
Content-Disposition: form-data; name="upload"

Upload these files
------------dYoBnRd189g2BFufzLmOdjSh--


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

p.s. соответственно в первом случае заливка проходит нормально
во втором хрен
цитата
05/04/07 в 16:39
 xreload
Что значит "пытаюсь отправить" ?
Куда отправить на сервер,клиенту?
Показывай скрипт.

p.s.
50% ответа - это правильно заданный вопрос...
цитата
05/04/07 в 17:07
 Lamagro
POST запросом отправить на сервер...
Скрипт самый обычный, PostData - это тот заголовок что раньше запостил...
Код:

$out  = "POST ".$Path." HTTP/1.1\r\n";
$out .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n";
$out .= "Accept-Encoding: deflate\r\n";
$out .= "TE: deflate\r\n";
$out .= "Accept-Language: en-us\r\n";
$out .= "Cache-Control: no-cache\r\n";
$out .= "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n";
if ($Cookie) {$out .= "Cookie: ".$Cookie."\r\n";}
if ($Cookie2) {$out .= "Cookie2: ".$Cookie2."\r\n";}
$out .= "Content-Type: multipart/form-data; boundary=------------".$boundary."\r\n";
$out .= "Connection: Keep-Alive \r\n";
//$out .= "Content-type: application/x-www-form-urlencoded\r\n";
$out .= "Host: ".$info['host']."\r\n";
if ($Referer) {$out .= "Referer: $PostUrl\r\n";}
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData; 
@$socket = fsockopen($info['host'], $info['port'], $errno, $errstr,10);
$Page = "";
if ($errno !== 0 | !$socket)
{echo "Connect failed! ".$url." ".$errno."\n"; }
else
{
         fputs ($socket, $out);
         while (!feof($socket))
        {
           $Page.=fgets($socket);
         }
         fclose($socket);
}
цитата
05/04/07 в 18:51
 Cibtor
На первый взляд, у тебя отсутствует еще один перевод строки после Content-length
цитата
06/04/07 в 02:04
 xreload


+1

Lamagro:заголовок запроса от тела запроса отделяется 2-мя переводами каретки.
цитата
06/04/07 в 05:06
 Lamagro
Код:
$out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData;
этого разве недостаточно?
если бы неправильно было я так понимаю - простая передача полей точно так же бы не работала - все работает - кроме боундари
цитата
06/04/07 в 05:20
 bleed
Код:
$out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData;

а зачем эти символы? всегда использовалось просто \n\n
цитата
06/04/07 в 06:03
 Lamagro
это я так понимаю что бы под виндой тоже работало...
отднако вопрос остался
цитата
06/04/07 в 09:38
 bleed

первый раз такое слышу...
так ты пробывал так \n\n или не пробывал?

вообще к чему приводит работа скрипта? ченить из данных приходит вообще?
цитата
06/04/07 в 09:51
 bleed
погоди давай попорядку
во первых без \r
Код:
$out  = "POST ".$Path." HTTP/1.1\n";
$out .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\n";
$out .= "Accept-Encoding: deflate\n";
$out .= "TE: deflate\n";
$out .= "Accept-Language: en-us\n";
$out .= "Cache-Control: no-cache\n";
$out .= "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\n";
if ($Cookie) {$out .= "Cookie: ".$Cookie."\n";}
if ($Cookie2) {$out .= "Cookie2: ".$Cookie2."\n";}
$out .= "Content-Type: multipart/form-data; boundary=------------".$boundary."\n";
$out .= "Connection: Keep-Alive \n";
//$out .= "Content-type: application/x-www-form-urlencoded\n";
$out .= "Host: ".$info['host']."\n";
if ($Referer) {$out .= "Referer: $PostUrl\n";}
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\n";
$out .= "Content-length: ".strlen($PostData)."\n\n".$PostData; 
@$socket = fsockopen($info['host'], $info['port'], $errno, $errstr,10);
$Page = "";
if ($errno !== 0 | !$socket)
{echo "Connect failed! ".$url." ".$errno."\n"; }
else
{
         fputs ($socket, $out);
         while (!feof($socket))
        {
           $Page.=fgets($socket);
         }
         fclose($socket);
}


во вторых что всетаки $PostData???
Цитата:
PostData - это тот заголовок что раньше запостил...

из твоих слов я понимаю так что $PostData это:

Код:
POST /cgi-bin/user_uploads.cgi HTTP/1.1
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Encoding: deflate
TE: deflate
Accept-Language: en-us
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Cookie: hfuser=tabl||checked|||
Cookie2: $Version=1
Content-Type: multipart/form-data; boundary=------------dYoBnRd189g2BFufzLmOdjSh
Connection: Keep-Alive
Host: host.com
Referer: http://host.com/cgi-bin/user_uploads.cgi
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Content-length: 143489

------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="account"

tabl
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="session"

xvfgNfjkTC1exxA
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="dir"


------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="file1"; filename="file1.html"
Content-Type: text/html

<html> бла бла бла бла тело файла </html>
------------dYoBnRd189g2BFufzLmOdjSh
.......................
.......................
.......................
.......................
Content-Disposition: form-data; name="upload"

Upload these files
------------dYoBnRd189g2BFufzLmOdjSh--

ну тогда неверно... т.к. ты передж этим уже вывел заголовок
цитата
06/04/07 в 10:26
 Lamagro
я накидал функцию и использовал ее когда надо было запостить.
Все прекрасно работало - проверено не раз
Счас нужно передать данные через мультипарт
Я так понимаю - координально в отправляемых заголовках должен измениться только Content-Type:

Вот так формируется $PostData
Код:
$boundary = generate_password(22);

      $PostData = "------------".$boundary." \n";
        $PostData .= "Content-Disposition: form-data; name=\"account\"\n\n";
        $PostData .= trim($username)."\n";
        $PostData .= "------------".$boundary." \n";
        $PostData .= "Content-Disposition: form-data; name=\"session\"\n\n";
        $PostData .= $SessionID."\n";
        $PostData .= "------------".$boundary." \n";
        $PostData .= "Content-Disposition: form-data; name=\"dir\"\n\n";
        $PostData .= "\n";
        $PostData .= "------------".$boundary." \n";
   
      // $a - массив названий файлов
        foreach ($a as $k => $v)
      {
         $kkk = $k+1;
         $PostData .= "Content-Disposition: form-data; name=\"file".$kkk."\"; filename=\"".$v."\"\n";
           $PostData .= "Content-Type: text/html\n\n"; //Content-type файла
           $PostData .= file_get_contents("./".$Dir."/".$v)."\r\n"; //Получаем содержимое файла
           $PostData .= "------------".$boundary."\n";
      }
      
      $PostData .= "Content-Disposition: form-data; name=\"upload\"\n";
        $PostData .= "\n";
        $PostData .= " Upload these files \n";
        $PostData .= "------------".$boundary."-- \n";

вот что $PostData содержит после
Код:
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="account"

tabl
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="session"

xvfgNfjkTC1exxA
------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="dir"


------------dYoBnRd189g2BFufzLmOdjSh
Content-Disposition: form-data; name="file1"; filename="file1.html"
Content-Type: text/html

<html> бла бла бла бла тело файла </html>
------------dYoBnRd189g2BFufzLmOdjSh
.......................
.......................
.......................
.......................
Content-Disposition: form-data; name="upload"

Upload these files
------------dYoBnRd189g2BFufzLmOdjSh--

[/code]


без \r тоже пробывал - пофиг

Последний раз редактировалось: Lamagro (09/04/07 в 11:13), всего редактировалось 1 раз
цитата
06/04/07 в 10:28
 Lamagro
так что все передается как надо - один в один как браузер (ну почти icon_smile.gif ) с одним лишь отличием - файлы незагружаются
цитата
06/04/07 в 11:46
 xreload
bleed писал:
Код:
$out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData;

а зачем эти символы? всегда использовалось просто \n\n


для совместимости.
цитата
06/04/07 в 11:54
 bleed
почитал про http, да ты был прав \r\n реомендуют... хотя раньше я писал на perl и никогда такого не видел нигде.

как я понял у тебя все параметры приходять коректно, т.е. скриптом ты их пролучаешь и последний параметр name="upload" передается и обробатывается нормально, так? только массив $_FILES пустой? если так тоя сдаюсь icon_smile.gif
цитата
06/04/07 в 12:59
 Lamagro
icon_smile.gif еех - яб тож сдался - немогу

Нашел какую-то драную гэсту - попробывать - может получится отследить проблему - в ней просто передается сообщение, но отправка идет через мультипарт - и хрен даже туда незапостилось icon_sad.gif
Хотя все точно так же полностью совпадает - сообщения нет.

пойду еще где нибудь поспрашаю...
цитата
06/04/07 в 13:51
 xreload
Ты сделал то что я написал тебе выше?
цитата
06/04/07 в 14:36
 Lamagro
xreload писал:
Lamagro:заголовок запроса от тела запроса отделяется 2-мя переводами каретки.

это?
дык там же и так два перевода каретки - раз нет?
Код:
$out .= "Content-length: ".strlen($PostData)."\r\n\r\n".$PostData;
цитата
09/04/07 в 09:42
 Lamagro
проехали
цитата
09/04/07 в 11:00
 Heavy
сразу скажу - не разбирался глубоко в вашем коде - может еще где лаги есть (если быстро писать, то с боундари легко напутать)... но имхо - вот так не стоило...
Код:

$PostData .= file_get_contents("./".$Dir."/".$v)."\r\n"; //Получаем содержимое файла


я например при отправке атачей в писмах - использую следующее:
тип контента
Код:

"Content-Transfer-Encoding: base64\n";

а содержимое файла -
Код:

= chunk_split(base64_encode(file_get_contents($attfile)));


на прямую (без коверканья base64) файл передавать можно - но полюбому необходимо какие-то манипуляции с ним произвести.
цитата
09/04/07 в 11:10
 Lamagro
Всем присутствовавшим спасибо. Всех оценил
Вопрос решен!
Подвело невнимание к мелочам.
Нужно вот так:
Код:

$boundary = "------------".generate_password(22);

$PostData .= "--".$boundary.\n;
$PostData .= "Content-Disposition: form-data; name=\"username\"".\n\n;
$PostData .= trim($username).\n;
$PostData .= "--".$boundary.\n\n;
ну и так далее...
цитата
09/04/07 в 11:11
 Lamagro
Heavy писал:
на прямую (без коверканья base64) файл передавать можно - но полюбому необходимо какие-то манипуляции с ним произвести.

кстати файл передался просто так:
Код:
$PostData .= file_get_contents("./".$Dir."/".$v).DCRLF;

так что вполне возможно работать и без преобразования .


Эта страница в полной версии