TIdMultipartFormDataStream
специально разработан только для multipart/form-data
(отсюда и его название) и, таким образом, передает жесткие коды от TIdMultipartFormDataStream
до TIdHTTP.Post()
от TIdHTTP.Request.ContentType
до multipart/form-data
.Нет возможности перезаписать это 1 .
. Чтобы сделать то, что вы хотите, вам придется вручную создавать свои собственные данные MIME и сохранять их в TStream
по вашему выбору * 1012.* кроме TIdMultipartFormDataStream
(например, TMemoryStream
), и затем вы можете Post()
этот поток с любым TIdHTTP.Request.ContentType
, который вы хотите.Например:
PostStream := TMemoryStream.Create;
try
// you may have to tweak this based on your REST provider's actual requirements...
WriteStringToStream(PostStream, '----myboundary' + EOL);
WriteStringToStream(PostStream, 'Content-Type: application/json; charset="utf-8"; name="documentmetadata"' + EOL);
WriteStringToStream(PostStream, EOL);
WriteStringToStream(PostStream, JSON.ToString, IndyTextEncoding_UTF8);
WriteStringToStream(PostStream, EOL + '----myboundary' + EOL);
WriteStringToStream(PostStream, 'Content-Type: ' + GetMIMETypeFromFile(FilePath) + '; name="content"' + EOL);
WriteStringToStream(PostStream, 'Content-Disposition: attachment; filename="' + ExtractFileName(FilePath) + '"' + EOL);
WriteStringToStream(PostStream, EOL);
FS := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);
try
PostStream.CopyFrom(FS, 0);
finally
FS.Free;
end;
WriteStringToStream(PostStream, EOL + '----myboundary--' + EOL);
PostStream.Position := 0;
FidHttp.Request.ContentType := 'multipart/mixed; boundary="--myboundary"';
FidHttp.Post(url, PostStream);
finally
PostStream.Free;
end;
1: При этом я экспериментировал с добавлением поддержки пользовательского ContentType
в TIdMultipartFormDataStream
, но это не проверено в основной кодовой строке Indy.в это время.