|
|
|
| Вот никак не могу разобраться ;-( Поясните пожалуйста?..
Вот фрагмент из описания услуги...
-----------------------------------------------------------------------------------
Формат запроса к сайту при наличии MMS данных в запросе.
MMS запрос с данными к сайту со статусом MMS делается POST-запросом с
Content-Type: multipart/form-data
Рассмотрим последовательность команд:
MASTER MMS CREATE
MASTER MMS SET URL http://domain/path?text=%*%&voc=%voc%&pid=%pid%
MMS обращение к данному сайту с фотографией вида:
MASTER MMS Test + ФОТО
Приведет к формированию запроса вида:
POST /path HTTP/1.0
Date: дата запроса
Host: сервер, осуществляющий запрос
User-Agent: MASTER-MMS
Content-Type: multipart/form-data; boundary="--MMSPART--"
Content-Length: ДлинаТелаЗапроса
----MMSPART--
Content-Disposition: form-data; name="text"
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: base64
Test <ems:mms url="mms_0"> (в кодировке 1251, закодированное механизмом BASE64)
----MMSPART--
Content-Disposition: form-data; name="voc"
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: base64
Тест <ems:mms url="mms_0"> (в кодировке 1251, закодированное механизмом BASE64)
----MMSPART--
Content-Disposition: form-data; name="pid"
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: base64
BASE64 закодированный идентификатор телефона в кодировке 1251
----MMSPART--
Content-Disposition: form-data; name="mms_0"; filename="mms_0"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
BASE64 закодированные данные ФОТО в формате image/jpeg
----MMSPART----
| В приведенном примере следует обратить внимание на конструкцию <ems:mms url="mms_0"> внутри параметров text (полный текст запроса) и voc (текст запроса, преобразованный в русский язык). Данная конструкция описывает размещение MMS-элемента внутри текста запроса. Сам MMS-элемент находится в одном из разделов запроса и имеет name=mms_0 и filename=mms_0.
-----------------------------------------------------------------------------------
Поясните пожалуйста что здесь к чему, и как мне таки получитькартинку и сохранить ее в файл на хостинге? | |
|
|
|
|
|
|
|
для: Sfinks
(29.12.2004 в 22:50)
| | А задача какая? Сформировать POST-запрос, яки телефон или просто получиь и прочитать то безобразие, которое телефон присылает? | |
|
|
|
|
|
|
|
для: cheops
(29.12.2004 в 22:57)
| | Смысл такой....
Когда юзер отправляет в BeeLine MMS с текстом
MASTER MMS текст и картинкой, то формируется вот такая лабуда :-)
А задача такая...
Получить текст в переменную, а картинку в файл *.jpg на том же сервере, где находится php, которому адресован етот запрос. А остальное - дело техники. | |
|
|
|
|
|
|
|
для: Sfinks
(29.12.2004 в 23:10)
| | Хм... тогда следует с ними обходится так, будто вам их прислали из формы. Т.е. чтобы получить текст следует обратиться к $_POST['voc']
<?php
// Это на английском
echo $_POST['text'];
echo "<br><br>";
// Это на русском
echo $_POST['voc'];
// К файлу обращаемся так, если бы нам прислали изображение
copy($_POST['mms_0']['tmp_name'],"image/".$_POST['mms_0']['name']);
>
|
Правда там всё в BASE64 закодировано, может понадобится повозится с преобразованием если сервер сам это не захочет этого сделать... | |
|
|
|
|
|
|
|
для: cheops
(29.12.2004 в 23:28)
| | Ну к раскодированию я вернусь, если не захочет...
А здесь 'tmp_name' и 'name' - это что такое? Или прям так и писать?
Я другого не пойму...
там же написано:
разве ето не значит, что сама картинка уже находится в какойто переменной типа resource? А если находится, то ее просто нужно сохранить? А если сохранить, то функцией imagejpeg? А у етой функции есть такое:
Замечание: JPEG support is only available if PHP was compiled against GD-1.8 or later.
| А если не работает? У меня хотя версия PHP - 5.0.3, а про функцию, например imagecreatefromjpeg ваще говорит, что такой нету =((
И mms_0 я не понял, это resource картинки, или string Имя_файла??? | |
|
|
|
|
|
|
|
для: Sfinks
(29.12.2004 в 23:52)
| | Все присылаемые через метод POST файлы хранятся во временной директории
'tmp_name' - имя файла во временной директории (не совпадает с именем файла)
'name' - здесь передаётся имя файла
http://www.softtime.ru/info/articlephp.php?id_article=13
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=445
Вот это
засовывается в $_FILES[' mms_0']['type']
Функция imagejpeg - вообще из графической библиотеки GDLib и предназначена для создания дескриптора JPEG-файла, чтобы на нём потом средствами этой библиотеки рисовать
http://www.softtime.ru/group/id_group=15
mms_0 - это имя файла (строка), если бы мы отправляли файл text.txt через форму, то вместо mms_0 был бы text.txt, но пчёлы демонстрируют высший класс в названиях файлов :))) | |
|
|
|
|
|
|
|
для: cheops
(30.12.2004 в 00:08)
| | Фуххх =))
СПАСИБО!
Теперь все понятно =))
Ну не могу я писать, не понимая принципа, "как оно работает" :))
Наверно ето рефлекс оставшийся еще от агатовского басика ;-)) Гы-гы. | |
|
|
|
|
|
|
|
для: cheops
(29.12.2004 в 23:28)
| | Е-еххх.... =((
Вы правы были - он не захотел сам раскодировать данные из BASE64 =((
Ну и че с ним теперь делать? Я ни малейшего представления об етом не имею =((
И попутно еще вопрос...
Временные файлы от POST запроса где находятся? В своей папке я их не увидал через FTP-клиент... И кто отвечает за их своевременное удаление? Или они сами удаляются после выполнения получившего их скрипта? | |
|
|
|
|
|
|
|
для: Sfinks
(30.12.2004 в 18:02)
| | Млин, я частично разобрался, но чет не пашет....
Обрашение - MMS.
Соответственно запрос по форме выше.
Код...
<?php
header("Content-Type: text/plain");
header("Content-Transfer-Encoding: base64");
$txt = $_POST['txt'];
if(empty($txt))
{
$txt = $_GET['txt'];
$pid = $_GET['pid'];
$nik = $_GET['nik'];
$reg = $_GET['reg'];
$form = 'GET';
}
else
{
$txt = base64_decode($txt);
$pid = base64_decode($_POST['pid']);
$nik = base64_decode($_POST['nik']);
$reg = base64_decode($_POST['reg']);
$form = 'POST';
}
echo'Формат запроса: '.$form;
$KolMMS = substr_count($txt,'<ems:mms');
if($KolMMS)
{
for($i = 0; $i < $KolMMS; $i++)
{
if($form == 'POST')
{
$mms_tmp_name[$i] = base64_decode($_POST['mms_'.$i]['tmp_name']);
$mms_name[$i] = base64_decode($_POST['mms_'.$i]['name']);
$mms_size[$i] = base64_decode($_POST['mms_'.$i]['size']);
$mms_type[$i] = base64_decode($_POST['mms_'.$i]['type']);
echo'tmp_name='.$mms_tmp_name[$i].' name='.$mms_name[$i].' size='.$mms_size[$i].' type='.$mms_type[$i];
copy($mms_tmp_name[$i],'obyav/'.$mms_name[$i]);
}
}
}
echo'PID='.$pid.' Nick='.$nik.' Region='.$reg.' Text='.$txt;
?>
| Так вот он txt, pid, nik и reg раскодирует, а mms_.... нет!
Вернее выдает в echo пустые строки!
Почему? :-/ | |
|
|
|
|
|
|
|
для: Sfinks
(30.12.2004 в 19:53)
| | Хм... а вы его не выводите echo, а сохраняйте в виде отдельного файла... я насколько понимаю это картинка? Тогда с ней и следует обращаться как с картинкой... | |
|
|
|
|
|
|
|
для: Sfinks
(30.12.2004 в 18:02)
| | Временные файлы находятся в специальной общей директории отведённой администратором сервера под это дело, в php.ini. Вообще их можно и удалять и это считается хорошим тоном и не позволяет злоумышленнику завладеть этими файлами, в том слудчае, если он получит доступ к директории с временными файлами. На практике очень часто они не удаляются, поэтому эту директорию чистят системные скрипты запускаемые в определённое время демоном cron. Как действуют скрипты - удаляют всё сразу или только файлы старее определённого времени зависит от пристрастий и вкусов администратора, писавшего такой скрипт. | |
|
|
|
|
|
|
|
для: cheops
(30.12.2004 в 21:54)
| | Ну, что же.... Вернемся к нашим слонам :-))
Еще раз код (немного исправленый и без лишнего)...
<?
$txt = $_POST['txt'];
if(empty($txt))
{
$txt = $_GET['txt'];
$format = 'GET';
}
else
{
$txt = base64_decode($txt);
$format = 'POST';
}
echo"Формат запроса: $format.\n$txt";
$KolMMS = substr_count($txt,'<ems:mms');
if($KolMMS && ($format == 'POST'))
for($i = 0; $i < $KolMMS; $i++)
{
$mms_tmp_name[$i] = base64_decode($_FILES["mms_".$i]["tmp_name"]);
$mms_name[$i] = base64_decode($_FILES["mms_".$i]["name"]);
$mms_size[$i] = base64_decode($_FILES["mms_".$i]["size"]);
$mms_type[$i] = base64_decode($_FILES["mms_".$i]["type"]);
echo "\ntmp_name_$i=$mms_tmp_name[$i]; name_$i=$mms_name[$i]; size_$i=$mms_size[$i]; type_$i=$mms_type[$i].";
// copy($mms_tmp_name[$i],'obyav/'.$mms_name[$i]);
}
?>
| Запросом является такое MMS:
Текст (картинка) (анимашка) текст (мелодия)
| И возвращает он вот такую ерунду:
Формат запроса: POST.
Текст <ems:mms url="groovy.jpg"> <ems:mms url="groovyanim.gif"> текст <ems:mms url="160.mid">
tmp_name_0=; name_0=; size_0=; type_0=.
tmp_name_1=; name_1=; size_1=; type_1=.
tmp_name_2=; name_2=; size_2=; type_2=.
|
Если строка copy() не закоментарена, то выдает ошибку (файл такой-то не найден).
Проанализировав всю ету ерунду и наложив значение переменной $txt на формат генерируемого запроса (в начале статьи), делаем вывод, что в описании mms_0 - это не имя переменной из массива $_FILES, а параметр name переменной с неизвестным именем, так как groovy.jpg, groovyanim.gif, 160.mid - это имена файлов, которые я и запихивал в MMS!
Так вот вопрос!
Как можно, зная значение параметра name узнать имя_переменной, чтобы получить параметры tmp_name, size и type??? | |
|
|
|
|
|
|
|
для: Sfinks
(02.01.2005 в 12:32)
| | Сделайте такую вещь: просто выведите содержимое массивов $_POST и $_FILES. Тогда нам будет известны все элементы у этих массивов - среди них и будет нужный:
<?php
print_r($_POST);
print_r($_FILES);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(02.01.2005 в 12:40)
| | А, ну тада понятно =))
Я думаю ето все решит, но вывести не смогу, т.к. у меня MMS накрылось медным тазом =((((((((
Кстати, случайно не знаете, где найти прошивку на Alcatel 535? Я пол инета облазил =(( Не могу продолжать работу. | |
|
|
|
|
|
|
|
для: cheops
(02.01.2005 в 12:40)
| | ЗДРАВСТВУЙТЕ =))
Такая вот ПРОБЛЕМА....
Я в HTML полный ноль, а тем более в работе с формами, а нужно оттестировать php'шку, которая обрабатывает POST-запрос описаный в начале темы. Причем обработка сложная и очень разветвленая (код на 500+ строк), поетому нужно съэмулировать запрос, максимально приближенный к реальному!
Я даже близко не представляю, как это сделать! Помогите пожалуйста?!
Я уточню, что из себя представляет этот запрос....
Во-первых, что должно быть на форме - пара полей для выбора файлов, поля для ввода ТЕКСТа, PID и РЕГИОНа, и кнопка "Отправить".
Значения полей PID и регион отправляются как есть в переменные $pid и $reg, а к тексту перед отправкой (для тестирования не важно где, пускай в конце) дописываются такие теги:
<ems:mms url="имя_файла_на_отправляющем_сервере"> -по 1 для каждого прикрепленного файла.
Полученный текст отправляется в переменную $txt.
Значения переменных $pid, $reg и $txt передаются в BASE64-закодированном виде.
Теперь, о том, как передаются файлы...
имя_файла_на_отправляющем_сервере -это, естесственно $_FILES["имя_переменной"]["name"];
причем (имя_переменной == имя_файла_на_отправляющем_сервере), только точка перед расширением заменяется на _
$_FILES["имя_переменной"]["tmp_name"] -я так понимаю, генерируется автоматически.
$_FILES["имя_переменной"]["type"] -если не само генерируется, то можно установить постоянным "image/jpeg", оттестирую на одном типе.
$_FILES["имя_переменной"]["size"] -не имеет значения, я ее не использую.
Т.е. для абстрактного файла "1.jpg" массив $_FILES выглядит так:
Array
(
[1_jpg] => Array
(
[name] => 1.jpg
[tmp_name] => /tmp/fhgjdmdlc
[type] => image/jpeg
[size] => 10426
[error] => 0
)
)
| Соответственно в конце текста должно быть дописано <ems:mms url="1.jpg">
И еще один нюанс - значения [name],[tmp_name],[type] передаются НЕ ЗАКОДИРОВАННЫМИ, а вот сам файл 1.jpg в /tmp/fhgjdmdlc сохраняется BASE64-закодированным =((
ОТ ТАКАЯ ВОТ БЕДА =((
ПОМОЖЕТЕ???
PLIIIZ!!! | |
|
|
|
|
|
|
|
для: Sfinks
(09.01.2005 в 20:14)
| | Можно воспользоваться следующей формой:
<table>
<form enctype='multipart/form-data' action=handler.php metod=POST>
<tr><td>Английский: </td><td><input size=71 type="text" name="text" value='Test <ems:mms url="mms_0">'></td></tr>
<tr><td>Русский: </td><td><input size=71 type="text" name="voc" value='Текст <ems:mms url="mms_0">'></td></tr>
<tr><td>Идентификатор телефона: </td><td><input size=71 type="text" name="pid" value=''></td></tr>
<tr><td>Регион: </td><td><input size=71 type="text" name="region" value=''></td></tr>
<tr><td>Файл 0</td><td><input size=71 type=file name=mms_0></td></tr>
<tr><td>Файл 1</td><td><input size=71 type=file name=mms_1></td></tr>
<tr><td>Файл 3</td><td><input size=71 type=file name=mms_1></td></tr>
<tr><td></td><td><input type="submit" value="Отправить"></td></tr>
</form>
</table>
|
Только параметры скорее всего придётся в самом начале скрипта кодировать самотоятельно. Т.е. осуществлять кодировку уже после того, как данные отправляются в обработчик handler.php
PS Не понятно что такое РЕГИОН и в каком параметре он должен передаваться... | |
|
|
|
|
|
|
|
для: cheops
(09.01.2005 в 23:19)
| | Вы не поняли смысла.... Мне нужна динамическая форма, которая будет изменяться в зависимости от введенных данных!
Т.е. в строке <input size=71 type=file name=mms_0> параметру name должно присваиваться не mms_0, а отредактированное имя файла! Например если выбираешь файл c:\music\1.mp3, то должно быть name=1_mp3
И к тексту дописываться не <ems:mms url="mms_0">, а <ems:mms url="1.mp3"> и только после выбора файла.
Или средствами HTML это сделать невозможно?
Тогда как сгенерировать подобный запрос в PHP?
Да, согласен, в начале скрипта можно перекроить данные, полученные из статичной формы, но тогда где гарантия, что я буду тестировать код верным запросом?
P.S.: А регион присваивается переменной $reg.
Вы составили форму для варианта:
MASTER MMS SETURL http://domain/path?text=%*%&voc=%voc%&pid=%pid%
а у меня вариант
MASTER MMS SETURL http://domain/path?pid=%pid%®=%region%&txt=%voc% | |
|
|
|
|
|
|
|
для: Sfinks
(10.01.2005 в 02:56)
| | Формировать POST-запрос это песня - будте уверены, что запустить его для приведённого выше запроса едва ли удасться ...
Да PHP неможет менять HTML-форму в зависимости от введённых данных - так как форма у клиента, а PHP - на сервере, даже JavaScript это не подсилу... здесь наверно нужно будет пропускать данные через несколько форм... т.е. вводим число файлов - пергружаемся на другую форму в которой поля для этих файлов, хотя... тоже наверное не получится... | |
|
|
|
|
|
|
|
для: cheops
(10.01.2005 в 12:12)
| | А я-таки его сформировал и запустил!
Причем 1:1 с тем, что требовалось съэмулировать =))
Пришлось пойти по подсказанному Вами пути.... предобработки в конечном файле.
Вот посмотрите, пожалуйста =)) Очень интересно Ваше авторитетное мнение =))
Форма:
<table>
<form enctype="multipart/form-data" action="obyavy.php" method="POST">
<tr><td>Текст:</td>
<td><FIELDSET ТIТLЕ="Компоненты текста"><LEGEND ALIGN="left">Компоненты текста</LEGEND>
<LABEL FOR="kom"> Команда:</LABEL>
<SELECT name="kom" SIZE="1"><OPTION VALUE="b2b">b2b<OPTION VALUE="b2g">b2g<OPTION VALUE="g2b">g2b<OPTION VALUE="g2g">g2g<OPTION VALUE="rb2b">rb2b<OPTION VALUE="rb2g">rb2g<OPTION VALUE="rg2b">rg2b<OPTION VALUE="rg2g">rg2g</SELECT>
<LABEL FOR="txt">Текст:</LABEL>
<INPUT SIZE=54 TYPE="text" NAME="txt"><br>
<INPUT TYPE="checkbox" NAME="m1" VALUE='<ems:mms url="http://server/file.jpg">'> Корректное MMS: <ems:mms url="http://server/file.jpg"><br>
<INPUT TYPE="checkbox" NAME="m2" VALUE='<ems:mms url="server/file.jpg">'> Некорректное MMS: <ems:mms url="server/file.jpg">
</FIELDSET></td></tr>
<tr><td>PID:</td>
<td><FIELDSET ТIТLЕ="Идентификатор телефона"><LEGEND ALIGN="left">Идентификатор телефона</LEGEND>
<INPUT TYPE="radio" NAME="pid" VALUE="FGHTYU">FGHTYU<INPUT TYPE="radio" NAME="pid" VALUE="UIOPLK">UIOPLK<INPUT TYPE="radio" NAME="pid" VALUE="QWERTY">QWERTY<INPUT TYPE="radio" NAME="pid" VALUE="ASDFGH">ASDFGH<INPUT TYPE="radio" NAME="pid" VALUE="ZXCVBN">ZXCVBN
</FIELDSET></td></tr>
<tr><td>Файл 1</td><td><input size=71 type=file name=mms_0></td></tr>
<tr><td>Файл 2</td><td><input size=71 type=file name=mms_1></td></tr>
<tr><td>Файл 3</td><td><input size=71 type=file name=mms_2></td></tr>
<tr><td></td><td><input type="submit" value="Отправить"></td></tr>
</form></table>
|
А вот код предобработки:
<?
$_POST["txt"] = $_POST["kom"]." ".$_POST["txt"];
unset($_POST["kom"]);
if(isset($_POST["m1"]))
{
$_POST["txt"] = $_POST["txt"]." ".$_POST["m1"];
unset($_POST["m1"]);
}
if(isset($_POST["m2"]))
{
$_POST["txt"] = $_POST["txt"]." ".$_POST["m2"];
unset($_POST["m2"]);
}
for($i = 0; $i < 3; $i++)
{
if($_FILES["mms_".$i]["tmp_name"])
{
$handle = @fopen($_FILES["mms_".$i]["tmp_name"],"r");
if($handle)
{
$file = fread($handle,filesize($_FILES["mms_".$i]["tmp_name"]));
fclose($handle);
$handle = @fopen($_FILES["mms_".$i]["tmp_name"],"w");
if($handle)
{
stream_filter_append($handle,'convert.base64-encode');
fwrite($handle,$file);
fclose($handle);
}
}
$_POST["txt"] = $_POST["txt"].' <ems:mms url="'.$_FILES["mms_".$i]["name"].'">';
// Здесь getname - функция, заменяющая
// точку перед расширением на _
$ts = getname($_FILES["mms_".$i]["name"]);
$_FILES[$ts] = $_FILES["mms_".$i];
unset($_FILES["mms_".$i]);
}
else
unset($_FILES["mms_".$i]);
}
switch($_POST["pid"])
{
case "FGHTYU": $_POST["reg"] = "Нальчик"; break;
case "UIOPLK": $_POST["reg"] = "Астрахань"; break;
case "QWERTY": $_POST["reg"] = "Москва"; break;
case "ASDFGH": $_POST["reg"] = "СПБ"; break;
case "ZXCVBN": $_POST["reg"] = "Волгоград"; break;
}
$_POST["txt"] = base64_encode($_POST["txt"]);
$_POST["pid"] = base64_encode($_POST["pid"]);
$_POST["reg"] = base64_encode($_POST["reg"]);
?>
|
1. Какие нибудь нюансы могут быть?
2. Неплохо для новичка? =))) | |
|
|
|
|
|
|
|
для: Sfinks
(10.01.2005 в 15:21)
| | Очень не плохо и стиль хороший, не к чему придраться кроме <?, который рекомендуется писать полностью <?php :))) | |
|
|
|
|
|
|
|
для: cheops
(10.01.2005 в 21:33)
| | Большое спасибо =)))
А почему рекомендуется?
Кстати насчет "рекомендуется".... Я то учебник потихоньку продолжаю корректировать, так вот там очень часто используются варианты типа
а рекомендуется писать
echo "текст ".$var." текст"
| чтоб PHP не приходилось сто раз туда-сюда переводить строки в переменные и обратно и заниматься их "вычленением"....
Так вот такие оплошности исправлять? | |
|
|
|
|
|
|
|
для: Sfinks
(10.01.2005 в 21:43)
| | Тэг <? иногда переоределяют для использования в других Web-технологиях, а уж <?php точно никем не зарезрвирован, кроме того сразу видно, что это PHP :))), но вообще проблемы здесь маловероятны...
Ну преобразование типа интепретатору придётся осуществлять в обоих случаях, во-втором случае PHP сработает быстрее, но читабельность кода по сравнению с первым варианом ниже, а это скрость отладки и написания Web-приложения - сейчас лимитирующая стадия - это человек, поэтому писать код следует так, каким образом, чтобы его могли легко читать вы и другие люди. | |
|
|
|
|
|
|
|
для: cheops
(10.01.2005 в 22:23)
| | Ну, ет Вам виднее =))
Просто так написано в руководстве по PHP.
Кстати, гады... половину перевели, а половину - сиди, мучайся =)) | |
|
|
|