Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение данных от формы HTTPServer'om


sairus ©   (2007-03-09 13:46:00) 

Есть простенькая html-страничка с таким вот кодом: <form method="POST" action="script.html">
  <p><input type="text" name="text" size="20"></p>
  <p><input type="submit" value="send" name="B1"><input type="reset" value="reset" name="reset"></p>
</form>

Как мне в моем приложении, построеное на idHTTPServer, принять значение, которое было введене в тесктовое поле "text" html-странички?  Ведь код ARequestInfo.Params.Value['text'] не работает!!!

Спасибо.


sairus   (2007-03-15 20:52:00) [1]

Блин, мне уже тошно тебе отвечать.... Самому слабо пример сделать.... Раз тебе говорят, что нормально файл принимает, значит нормально... именно так и делал... Все хорошо, как видишь и без твоего примера работает!!!!!!!!!!!
А то что там написано в Инди, мне все равно... оно у меня работает... Сам то можешь попробовать, а то только имеешь что языком трепать...


SlymRO   (2007-03-15 06:32:00) [2]

1. В исходник indy глядел? Не TMemoryStream но TStringStream точно создается...
LRequestInfo.PostStream := nil;
CreatePostStream(AContext, LRequestInfo.FPostStream);
LImplicitPostStream := LRequestInfo.PostStream = nil;
try
 if LImplicitPostStream then begin
    LRequestInfo.PostStream := TIdStringStream.Create('');   {Do not Localize}
 end;

2. байт в байт одинаковые? Чем отсылал? попробуй накатать простенький хтмл для отправки файла, загрузи его в IExplorer выбери файл и нажми пост... Что пришло в сервер? Код клиента приведи... но даже без кода видно что твой клиент не сможет передать файл через нормальный прокси, т.к. твой пост не соответствует стандарту...


sairus   (2007-03-14 23:34:00) [3]

Во-первых, если бы не надо было писать-не писал бы в OnCreatePostStream. Мог-бы уделить несколько минут перед критикой, и скомпилировать проект-тогда увидел бы...
Во-вторых, файлы, которые получает сервер байт в байт одинаковые, да и работают...
Во-третьих, я программирую на с++, и пример, который привел выше просто нашел в нете, лишь для того что показать что ВСЕ ТАКИ МОЖНО принимать файлы. А то что там по вопросах безопасности не так-не мои проблемы... код-то не мой...
Так что уважаемый SlymRO, факт есть факт: файлы принимаются!!! Вот из созданием вторго стрима согласен, но без него ошибка в памяти... :(


SlymRO   (2007-03-14 05:11:00) [4]

sairus   (13.03.07 17:56) [11]
Пипец...
1. Ты знал что в OnCreatePostStream этого: VPostStream:=TMemoryStream.Create можно и не делать? За тебя его сделано в дебрях инди...
2. "Это" не аплоад файла, "это" я низнаю что... Не под один стандарт "это не подходит", судя по всему в файле у тебя окажутся нераспарсеные параметры, и зачем они тебе, ведь они urlencoded :)
3. Лишняя операция, можно так: ARequestInfo.PostStream.SaveToFile('.\'+(DateToStr(now)+' '+TimeToStr(now)+' '+AThread.Connection.Socket.Binding.PeerIP));
4. С таким подходом DenialOfService сделать как 2 пальца обо.... 4.1. Файлом зафлудить сервер
4.2. Нет защиты от unbound файлов (втихаря образ DVD залить) а у тебя два мемори! стрема по 4.5GB каждый :) на клиента! а Таких умельцев может оказаться много гыгы


sairus   (2007-03-13 17:56:00) [5]

Все просто:
OnCreatePostStream пишем:
VPostStream:=TMemoryStream.Create

OnCommandGet:

Var PostedFile:TMemoryStream;
begin

If ARequestInfo.Document='/' Then begin
  With AResponseInfo do begin
    ContentText:=HtmlForm;
    WriteContent;
  end;
end else if ARequestInfo.Document='/upload/' then begin
  PostedFile:=TMemoryStream.Create;
  Try
    Try
      PostedFile.LoadFromStream(ARequestInfo.PostStream);
      PostedFile.SaveToFile('.\'+(DateToStr(now)+' '+TimeToStr(now)+' '+AThread.Connection.Socket.Binding.PeerIP));
      With AResponseInfo do begin
        ContentText:=HtmlForm('Upload Successful!');
        WriteContent;
      end;
    except
      With AResponseInfo do begin
        ContentText:=HTMLForm('Upload Error!');
        WriteContent;
      end;
    end;
  finally
    PostedFile.Free;
  end;
end;
end;


SlymRO   (2007-03-13 17:12:00) [6]

sairus   (13.03.07 16:55) [9]
Тебе многие спасибо скажут если ты свой вариант таки опубликуешь тута...


sairus   (2007-03-13 16:55:00) [7]


> Как принимает? если multipart то в инди нет стандартного
> метода... у меня есть...
>

Спасибо, SlymRO, ты мне уже давал свой код... Я уверен что он рабочий, но я не стал разбираться, а воспользовался стандартный (он там все такие есть ;-) )... Все проверял-работает...


SlymRO   (2007-03-13 09:57:00) [8]

sairus   (12.03.07 18:58) [5]
Дело в том, что у меня мой сервер принимает еще и файлы...

Как принимает? если multipart то в инди нет стандартного метода... у меня есть...


sairus   (2007-03-12 22:22:00) [9]

так то оно так.... Только вот обрабочтик события OnCreatePostStream и OnCommaтdGet  это ведь разные... создаю место под стрим я в первом, а читаю переменную я во втором... и как можно будет знать на перед что я буду делать??? Если не создам стрим VPostStream:=TMemoryStream.Create, то тогда ARequestInfo.PostStream не будет содержать файлик, а если создам то переменную не получу... Если бы это делалось во одном обработчике-без проблем, но вот с двумя... эт уж проблема...

Если ниче не найду-как-то выкручиваться буду.... Идея конечно одна есть...


Alexey (AZ)   (2007-03-12 21:03:00) [10]

Может сначала надо получить переменные а затем уже файл забирать в стрим? Насколько мне помнится такие штуки "вычитывают" перемещая данные, т.е. если в порте было, а мы оттуда перегнали в стрим (не важно куда, главное что забрали), то там где было уже не будет =)


sairus   (2007-03-12 18:58:00) [11]

о... заработало... я нашел ошибку...
Но нужна помощь...
Дело в том, что у меня мой сервер принимает еще и файлы...по-этому в обработчике события OnCreatePostStream написано  VPostStream:=TMemoryStream.Create
Если эту строчку закоментировать, то все работает... Обьясните в чем проблема и что можно сделать чтобы работало и принятие файлов, и, собственно, информацию от формы получало...
Надеюсь на помощь.
Спасибо.


sairus   (2007-03-12 17:42:00) [12]

Так в том-то и дело, что не работает...
Пишу ShowMessage(RequestInfo.Params.Values['text']);  а оно выдает пустое сообщение...

Что можно сделать?


SlymRO   (2007-03-12 05:11:00) [13]

Должно быть: IdHTTPServer1.ParseParams:=true;
и будет работать: RequestInfo.Params.Values['text'];


sairus   (2007-03-09 22:04:00) [14]

Простите, а больше никак...???? А то у меня ошибка Linker'а возникает... Может я неправильно использую ее, можете пример привести...
Спасибо.


Плохиш   (2007-03-09 16:37:00) [15]

GetEnvironmentVariable('text')


Наверх

Титульная страница Поиск, карта сайта Написать письмо