Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2024, 22:21
beralus beralus вне форума
Прохожий
 
Регистрация: 03.09.2022
Сообщения: 1
Версия Delphi: delphi 10
Репутация: 10
По умолчанию Обработка multipart/form-data с TIdHTTPServer

Люди добрые, после получение POST данные
Request и Response полученных от событии OnCommandGet объекта TIdHTTPServer и передается к след. функции.
Но полученные байты значительно отличаются от оргинала. Код взята с инета, чут изменен.Вожил исходный и байты. Они не соответсвуют. И естественно нарущается последователности байтов

Чего я неправилно делаю? Где моя ощибка?

Код:
  HandleMultipartUpload(Request: TIdHTTPRequestInfo;Response: TIdHTTPResponseInfo);
var
  LBoundary, LBoundaryStart, LBoundaryEnd: string;
  LDecoder: TIdMessageDecoder;
  LLine: string;
  LBoundaryFound, LIsStartBoundary, LMsgEnd: Boolean;

  // mine
  Decoder: TIdMessageDecoderMIME;
  LStream: TStream;
  fstream:TmemoryStream;
  I: integer;

begin

  LBoundary := ExtractHeaderSubItem(Request.ContentType, 'boundary', QuoteHTTP);
  if LBoundary = '' then
  begin
    Response.ResponseNo := 400;
    Response.CloseConnection := true;
    Response.WriteHeader;
    Exit;
  end;

  LBoundaryStart := '--' + LBoundary;
  LBoundaryEnd := LBoundaryStart + '--';

  LDecoder := TIdMessageDecoderMIME.Create(nil);
  try
    TIdMessageDecoderMIME(LDecoder).MIMEBoundary := LBoundary;
    LDecoder.SourceStream := Request.PostStream;
    LDecoder.FreeSourceStream := False;

    LBoundaryFound := False;
    LIsStartBoundary := False;
    repeat
      LLine := ReadLnFromStream(Request.PostStream, -1, true);
      if LLine = LBoundaryStart then
      begin
        LBoundaryFound := true;
        LIsStartBoundary := true;
      end
      else if LLine = LBoundaryEnd then
      begin
        LBoundaryFound := true;
      end;

    until LBoundaryFound;

    if (not LBoundaryFound) or (not LIsStartBoundary) then
    begin
      Response.ResponseNo := 400;
      Response.CloseConnection := true;
      Response.WriteHeader;
      Exit;
    end;

    LMsgEnd := False;

    repeat
      TIdMessageDecoderMIME(LDecoder).MIMEBoundary := LBoundary;
      LDecoder.SourceStream := Request.PostStream;
      LDecoder.FreeSourceStream := False;

      LDecoder.ReadHeader;
      case LDecoder.PartType of
        mcptText:
           ProcessMimePart(LDecoder, LMsgEnd, Response);
        mcptAttachment:
          begin
          fstream:=TmemoryStream.Create();

            
			{не правиьно получаетбайты}
			   var newDecor:TIdMessageDecoder:= LDecoder.ReadBody(fstream,LMsgEnd);
                fstream.SaveToFile(GetUploadFolder+LDecoder.Filename) ;
                LDecoder:=TIdMessageDecoderMime(newDecor);
                continue;
           end;

        mcptIgnore:
          begin
            LDecoder.Free;
            LDecoder := TIdMessageDecoderMIME.Create(nil);
          end;
        mcptEOF:
          begin
            LDecoder.Free;
            LMsgEnd := true;
          end;
      end;
    until (LDecoder = nil) or LMsgEnd;
  finally
    LDecoder.Free;
  end;
end;

lmikle: Пользуемся тегами при оформлении

исходные:
OrginalBytes.png
Код:
полученные:
ReceivedBytes.png

Последний раз редактировалось lmikle, 23.03.2024 в 22:25.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter