====== How To Send More Complex HTML Forms By HTTP Protocol ======
I have adapted the HTTPpostFile to allow you to upload the file and form fields together, instead of just the file. If you wish, add it to HTTPSend.pas
function HttpPostFileForm(const URL, FieldName, FileName: string;
const Data: TStream; const FormFields:TStrings; const ResultData:
TStrings): Boolean;
var
HTTP: THTTPSend;
Bound, s: string;
i:integer;
const
FIELD_MASK = CRLF + '--%s' + CRLF +
'Content-Disposition: form-data; name="%s"' + CRLF + CRLF+
'%s';
begin
Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
HTTP := THTTPSend.Create;
try
s := '--' + Bound + CRLF;
s := s + 'content-disposition: form-data; name="' + FieldName + '";';
s := s + ' filename="' + FileName +'"' + CRLF;
s := s + 'Content-Type: Application/octet-string' + CRLF + CRLF;
HTTP.Document.Write(Pointer(s)^, Length(s));
HTTP.Document.CopyFrom(Data, 0);
// Include formfield
for i:=0 to FormFields.Count-1 do
begin
S:= Format(FIELD_MASK,[Bound, FormFields.Names[I],
FormFields.Values[FormFields.Names[I]]]);
HTTP.Document.Write(Pointer(S)^, Length(S));
end;
s := CRLF + '--' + Bound + '--' + CRLF;
HTTP.Document.Write(Pointer(s)^, Length(s));
HTTP.MimeType := 'multipart/form-data; boundary=' + Bound;
Result := HTTP.HTTPMethod('POST', URL);
ResultData.LoadFromStream(HTTP.Document);
finally
HTTP.Free;
end;
end;
Regards,
Eric Paschoalick Chaves