|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Обработка 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 Код:
полученные: Последний раз редактировалось lmikle, 23.03.2024 в 22:25. |