Чтения POST из PHP
Кто знает, как прочитать то, что пришло в посте, причем нужна вся строка, а не разбитая по переменным...
ознакомся с
phpinfo();
?>
ознакомся с
phpinfo();
?>
Я знаю массив, в котором уже отредактированные переменные хранятся, но мне надо не это, а найти то, что передано было, всю полную строку...
Дело в том, что я передаю двоичные данные, а PHP такое начинает выделывать и забивать в массив, что выть хочется... Что можете посоветовать по передачи двоичной строки?
Кто знает, как прочитать то, что пришло в посте, причем нужна вся строка, а не разбитая по переменным...
В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...
А можно конкретнее раскрыть задачу?
Что именно надо через это сделать?
В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...
А можно конкретнее раскрыть задачу?
Что именно надо через это сделать?
В PERL это реализуется так:
read(STDIN, $szQ, $ENV{'CONTENT_LENGTH'});
}
Однажды предложили так сделать в PHP:
while (!feof($stdin)) {
$in .= fgets($stdin, 1024);
}
но не работает %(...
В смысле - вся строка POST? Насколько я знаю, строкой передаётся только GET (getenv('QUERI_STRING')). У POST вроде какой-то особый формат...
POST передается также строкой. По крайней мере контрол Internet Transfer Control пересылает строку vData...
А что именно сделать-то надо???
Надо прочитать всю строку POST но не через Perl а через PHP... Я уже начинаю думать, какой еще есть метод для посылки и принятия данных со скриптом на сервере?...
Надо прочитать всю строку POST но не через Perl а через PHP... Я уже начинаю думать, какой еще есть метод для посылки и принятия данных со скриптом на сервере?...
ЗАЧЕМ ИМЕННО?
Может быть, всё это можно гораздо легче сделать обычными средствами...
ЗАЧЕМ ИМЕННО?
Может быть, всё это можно гораздо легче сделать обычными средствами...
Начт так. У меня есть программа, написанная на VB, но это сейчас не важно. Сама программа на стадии разработки. Одна из функций этой программы - пересылать на сервер некоторую последовательность двоичных данных (грубо говоря строку с символами от chr(0) до chr(255), то есть любыми. Скорее всего FTP не подходит (поскольку мне не надо создавать файлов на серваке), а как значение переменной в методе GET тоже не послать - размер строки может быть до 500 кб, да еще и неизвестно, какие там символы. Да! эти данные я должен пихнуть потом в поле blob БД MySQL, вот почему еще FTP не подходит.
Я и решил использовать POST не по назначению, т.к. он пересылает данные практически любой длины... Но у меня не получается получить эти данные на скрипте, да и сама конструкция мне очень не нравится...
Не посоветуете, как еще передать такую "строчечку" на скрипт?
А какой предполагается метод реализации: куда в форме человек должен запихнуть эту строку? В textarea???
Это не имеет значения. На самом деле строку генерирует программа, поэтому там могут быть и chr(0) и chr(10) и все остальное, что, конечно, GET-ом не передать... да и постом, насколько я знаю, тоже не рекомендуется... В общем вопрос открыт - как передать эту строку с произвольными данными на скрипт?
Это не имеет значения. На самом деле строку генерирует программа, поэтому там могут быть и chr(0) и chr(10) и все остальное, что, конечно, GET-ом не передать... да и постом, насколько я знаю, тоже не рекомендуется... В общем вопрос открыт - как передать эту строку с произвольными данными на скрипт?
В смысле?
Какая-то программа на машине клиента обращается к php-скрипту? Тогда, может, это вообще надо не через php реализовывать...
Кстати, можно ещё делать, например, чтобы у клиента при отправке каждый символ заменялся на x+его код, а на сервере это уже разбирать...
В смысле?
Какая-то программа на машине клиента обращается к php-скрипту? Тогда, может, это вообще надо не через php реализовывать...
Кстати, можно ещё делать, например, чтобы у клиента при отправке каждый символ заменялся на x+его код, а на сервере это уже разбирать...
Во-первых, я уже склоняюсь ко мнению, что буду делать скрипт на Perl-е - там куча функций по работе со строками.
Во-вторых, если я каждый символ заменю тремя символами, то у меня длина запроса местами возрастет до мегабайта! А это недопустимо %(
И наконец даже изначальная строка у меня будет больше 65535 символов, а значит гетом ее не переслать...
Вот такая у меня беда %(...
Во-первых, я уже склоняюсь ко мнению, что буду делать скрипт на Perl-е - там куча функций по работе со строками.
Во-вторых, если я каждый символ заменю тремя символами, то у меня длина запроса местами возрастет до мегабайта! А это недопустимо %(
И наконец даже изначальная строка у меня будет больше 65535 символов, а значит гетом ее не переслать...
Вот такая у меня беда %(...
Так и не понял какие у тебя проблемы были:
массив $_POST всех их решает.
Начт так. У меня есть программа, написанная на VB, но это сейчас не важно. Сама программа на стадии разработки. Одна из функций этой программы - пересылать на сервер некоторую последовательность двоичных данных (грубо говоря строку с символами от chr(0) до chr(255), то есть любыми.
....
Не посоветуете, как еще передать такую "строчечку" на скрипт?
Значит так, направление выбрано правильное. Но на PHP не как не получить POST данные одним блоком, так как PHP сам читает из stdin и раскидывает все по массивам.
По этому надо доводить дело до конца, а именно эмулировать закачку файла. А ты это уже почти сделал, осталось только правильные заголовки подставить.
Заголовки узнать тебе поможет снифер.
И на PHP тогда можно будет работать с массивом $_FILES
Передается, бинарный фаил ? Метадом Пост ?
Никаких проблем не представляет выдернуть из переменную из массива: $_POST также не каких проблем не состовляет узнакть сколько переменных в масиве $_POST обычным count , и потом склеить если нужно.
Что то не очень понятно зачем все это..
Передается, бинарный фаил ? Метадом Пост ?
Никаких проблем не представляет выдернуть из переменную из массива: $_POST также не каких проблем не состовляет узнакть сколько переменных в масиве $_POST обычным count , и потом склеить если нужно.
Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.
Никто не дает гарантии, что PHP больше ничего не делает с POST данными.
Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.
Mike, а где просвятиться можно на эту тему?
Когда данные передаются, методом, пост на сколько мне известно с ними ничего не происходит, ситуация описанная тобой характерна для GET /
Если бы только для GET...
Ага, и тут встречается символ + в бинарном файле и автоматически заменяется на пробел. Или последовательность %CC и автоматически делается urldecode.
Никто не дает гарантии, что PHP больше ничего не делает с POST данными.
Вот-вот!... И я о том-же. На Perl у меня получилось получить всю строку данных, но в PHP что в массиве $_POST (php4), что в $HTTP_POST_VARS (php3), выдается каша, чего и следовало ожидать... я решил "кодировать" бинарные данные в безопасные символы, а именно каждый байт представлю как 2 буквы от A до P, по-моему. т.е. разобью байт в 8 бит на 2 по 4 бита... конечно это замедлит скорость передачи данных, но по количествув передаваемых данны можно судить, что это не сильно замедлит скорость работы моей программы. Тем более имеет место автоматическое сжатие пакетов данных. Теперь вопрос в другом - как через функции WIN32 API отослать данные методом пост?
Поповоу, POST если честно не ожидал, cейчас рук , не хватает все это проверить..
Если уж так плохо, все с пост.., то тогда рекомендую прислушится к майку:
>По этому надо доводить дело до конца, а именно >эмулировать закачку файла. А ты это уже почти >сделал, осталось только правильные заголовки >подставить.
>
>Заголовки узнать тебе поможет снифер.
>
>И на PHP тогда можно будет работать с массивом >$_FILES
А то какое то очень кривое решение у тебя вышло.. , хотя главное работает :)
>И на PHP тогда можно будет работать с массивом >$_FILES
А то какое то очень кривое решение у тебя вышло.. , хотя главное работает :)
Что главное сейчас, так это то что не работает %((. Тем более приходится учитывать, что обращений к этому скрипту можеь быть очень много (напр. 100 за минуту), а количество передаваемых данных между 50 и 200 кб. Если сервак станет каждый раз в темп писать файл, я его стану открывать и пихать в память (переменную), то есть риск свалить сервак. Тем более по задаче получается что я должен юзать функции Win32 API....
На самом деле, возможно, вы правы по поводу файла. Но как это сделать не через контрол, а через виндовые функции?
Если сервак станет каждый раз в темп писать файл, я его стану открывать и пихать в память (переменную), то есть риск свалить сервак. Тем более по задаче получается что я должен юзать функции Win32 API....
Я не понимаю, тебе беспокоит клиентская часть или серверная ??
Я не понимаю, тебе беспокоит клиентская часть или серверная ??
Согласен и извиняюсь - на данный момент попытка убивания 2-х зайцев не актуальна... Тогда вопрос такой - как обратиться к http-скрипту и передать файл? Если у Вас есть сэмпл, буду очень благодарен!
Согласен и извиняюсь - на данный момент попытка убивания 2-х зайцев не актуальна... Тогда вопрос такой - как обратиться к http-скрипту и передать файл? Если у Вас есть сэмпл, буду очень благодарен!
Повторюсь :) снифер тебе поможет :)
Повторюсь :) снифер тебе поможет :)
У меня наверное заскок, но я не могу понять, о каком снифере вы говорите?
У меня наверное заскок, но я не могу понять, о каком снифере вы говорите?
О любом. Твоя задача посмотреть что передает браузер при закачке файла по HTTP и потом сделать то же самое из своей программы.
О любом. Твоя задача посмотреть что передает браузер при закачке файла по HTTP и потом сделать то же самое из своей программы.
Честно говоря, юзать снифер для этого совсем не обязательно, тем более что человек судя по всему не знает что это такое и не умеет пользоваться перехчиками пакетов.
Нужно просто сформировать правильный HTTP-запрос ( формат сего очень легко найти в стандарте протокола HTTP/1.0 [ 1.1 ] порывшись минут десять в RFC 2616 .
Далее, по поводу обработки интерпритатором данных передаваемых методом POST. Практически ничем PHP их не обрабатывает. Как пример:
Отправим их одного файла данные в другой и глянем ...
index.html
<input type="hidden" name="s0" value="lqoi43cp8y9q'34tp98yq3vqp 843">
<input type="hidden" name="s1" value="*(#P)(*U@UP)(*UEW)(PUP)(WE">
<input type="hidden" name="s2" value="!@#$%^&*()_+">
<input type="hidden" name="s3" value="P(*#VP(*Y#VR:OJWRE:LJLNE:OHRQPOJR">
<input type="submit" value="send data">
</form>
phpinfo.php
print "<pre>";
var_dump($_POST);
print "</pre>";
?>
Результат
["s0"]=>
string(30) "lqoi43cp8y9q\'34tp98yq3vqp 843"
["s1"]=>
string(26) "*(#P)(*U@UP)(*UEW)(PUP)(WE"
["s2"]=>
string(12) "!@#$%^&*()_+"
["s3"]=>
string(33) "P(*#VP(*Y#VR:OJWRE:LJLNE:OHRQPOJR"
}
Как видно, единственное, что сделал PHP так это отремил одинарную кавычку слэшем - это все.
Так что тут особо беспокоится не о чем. Эта проблемка легко решается простым preg_replace().
По поводу трудности определения длинны переданных данных я что-то вообще не понял в чем трудность. Достаточно просто считать пришедший заголовок и посмотреть значение Content-Length - именно для этого придумали переменную $_SERVER["CONTENT_LENGTH"] :)
И напоследок, по поводу клиента на VB - это же идиотизм - если напишешь его на Visual C++ все будет гораздо проще - особенно с отправкой данных по HTTP протоколу методом POST :)
Как видно, единственное, что сделал PHP так это отремил одинарную кавычку слэшем - это все.
Эксперимент нельзя считать полным. Например не известно что будет если встретится 0 в файле. Возможно PHP завершит им строку. А 255 ??
Достаточно просто считать пришедший заголовок и посмотреть значение Content-Length - именно для этого придумали переменную $_SERVER["CONTENT_LENGTH"] :)
При POST запросах поле Content-Length передается далеко не всегда. Но если клиент свой, то такой проблемы нет. А вообще даже у wget есть опция
--ignore-length игнорировать поле заголовка `Content-Length'.
И напоследок, по поводу клиента на VB - это же идиотизм - если напишешь его на Visual C++ все будет гораздо проще.
И напоследок, с каких это пор писать на VC++ стале проще чем на бейсике ??? :D
Accept-Language: ru
Content-Type: multipart/form-data; boundary=---------------------------7d3305169f0172
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: server.ru
Content-Length: 1529
Cache-Control: no-cache
-----------------------------7d3305169f0172
Content-Disposition: form-data; name="userfile"; filename="C:\image.gif"
Content-Type: image/gif
GIF89 и тп и тд ...тут код файла, длиной в 1529 байт
-----------------------------7d3305169f0172
О том как работать с файлами на PHP можно прочитать тут:
http://ru3.php.net/manual/ru/features.file-upload.php
Эксперимент нельзя считать полным. Например не известно что будет если встретится 0 в файле. Возможно PHP завершит им строку. А 255 ??
Не думаю что PHP может завершить строку чем-то кроме \X0A :) Все-таки PHP на С написан :)
При POST запросах поле Content-Length передается далеко не всегда. Но если клиент свой, то такой проблемы нет. А вообще даже у wget есть опция
--ignore-length игнорировать поле заголовка `Content-Length'.
А причем ту wget? Насколько я понимаю, клиент только свой и заголовок формируется не кем-то со стороны :) А Content-Length не может не присутствовать - хотя бы потому, что иначе нарушается стандарт протокола.
И напоследок, с каких это пор писать на VC++ стале проще чем на бейсике ??? :D
Как по мне, то всегда было :) зависит от того, кто с чего начинал - кто с бейсика а кто с асма и си :)
А в данном случае - си лучше работат с WinApi чем бейсик, да в принципе и всегда лучше работал. Или нет? :)
Да! и мне кажется, что все-таки в VB это реализовывается проще... но если у Вас есть пример, выполняющий эти функции на VC++, то я буду раз сделать из него DLL-ку и пустить ее по рукам кому надо будет...
Еще раз спасибо! %)
Спасибо за дискуссию и ссылки! Очень им рад! Со стороной PHP (серверной) все ясно... Но есть ли какие-то стандартные стредства посылки файла методом POST на сервер? Ато снифером пользоваться равносильно ковырянию формата...
Я VB в глаза не видел. Но уверен что есть. Вон в Delphi и в C++ Builder есть Indy HTTP Client да и еще что-нить наверняка.
Не думаю что PHP может завершить строку чем-то кроме \X0A :) Все-таки PHP на С написан :)
Вот вы начинали с асма и си, и до сих пор не представляете себе как в си хранятся строки.
Вам термин "Null terminated string" о чем нибудь говорит ??? В СИ строка заканчивается кодом "0".
10 и 13 - это перенос строки и возврат картеки. Не надо будать
вот пример:
char *str="hello\r\nhello";
printf("%d\n",strlen(str));
str[3]=0x0A;
printf("%d\n",strlen(str));
str[3]=0;
printf("%d\n",strlen(str));
}
на выходе мы имеем:
12
3
Подробнее читаем тут:
http://www.codenet.ru/progr/cpp/spru/strlen.php
А причем ту wget? Насколько я понимаю, клиент только свой и заголовок формируется не кем-то со стороны :)
Перечитываем мой предыдущий пост
А Content-Length не может не присутствовать - хотя бы потому, что иначе нарушается стандарт протокола.
В HTTP 1.1 не написано что это поле должно присутсвовать, там написано что оно может быть.