Я пытаюсь внедрить POST
в веб-службу. Мне нужно отправить файл, тип которого является переменным (.docx
, .pdf
, .txt
) вместе с форматированной строкой JSON.Загрузка файла не удалась, когда публикация с Indy и имя файла содержит греческие символы
я смог успешно размещать файлы с кодом, подобную следующей:
procedure DoRequest;
var
Http: TIdHTTP;
Params: TIdMultipartFormDataStream;
RequestStream, ResponseStream: TStringStream;
JRequest, JResponse: TJSONObject;
url: string;
begin
url := 'some_custom_service'
JRequest := TJSONObject.Create;
JResponse := TJSONObject.Create;
try
JRequest.AddPair('Pair1', 'Value1');
JRequest.AddPair('Pair2', 'Value2');
JRequest.AddPair('Pair3', 'Value3');
Http := TIdHTTP.Create(nil);
ResponseStream := TStringStream.Create;
RequestStream := TStringStream.Create(UTF8Encode(JRequest.ToString));
try
Params := TIdMultipartFormDataStream.Create;
Params.AddFile('File', ceFileName.Text, '').ContentTransfer := '';
Params.AddFormField('Json', 'application/json', '', RequestStream);
Http.Post(url, Params, ResponseStream);
JResponse := TJSONObject.ParseJSONValue(ResponseStream.DataString) as TJSONObject;
finally
RequestStream.Free;
ResponseStream.Free;
Params.Free;
Http.Free;
end;
finally
JRequest.Free;
JResponse.Free;
end;
end;
Проблема возникает, когда я пытаюсь отправить файл, который содержит греческие символы и пробелы в имени файла. Иногда это терпит неудачу, и иногда это удается.
После большого количества исследований я замечаю, что заголовок POST
кодируется классом Indys TIdFormDataField
с использованием функции EncodeHeader()
. Когда сообщение выходит из строя, закодированное имя файла в заголовке разделяется по сравнению с успешным сообщением, где не разделяется.
Например:
Επιστολή εκπαιδευτικο.docx
кодируется как=?UTF-8?B?zpXPgM65z4PPhM6/zrvOriDOtc66z4DOsc65zrTOtc+Fz4TOuc66zr8uZG9j?='#$D#$A' =?UTF-8?B?eA==?=
, который выходит из строя.Επιστολή εκπαιδευτικ.docx
закодирован как=?UTF-8?B?zpXPgM65z4PPhM6/zrvOriDOtc66z4DOsc65zrTOtc+Fz4TOuc66LmRvY3g=?=
, который преуспевает.Επιστολή εκπαιδευτικ .docx
кодируется как=?UTF-8?B?zpXPgM65z4PPhM6/zrvOriDOtc66z4DOsc65zrTOtc+Fz4TOuc66?= .docx
, что не работает.
Я пытался изменить кодировку файла, тем AContentType
из AddFile()
процедуры и ContentTransfer
, но ни один из них не изменят свое поведение, и я все еще получаю ошибки при кодированном файле расщепляется.
Это какая-то ошибка, или я чего-то не хватает?
Мой код работает для каждого случая, за исключением описанных выше.
Я использую Delphi XE3 с Indy10.
Большое спасибо @Remy за ответ и все объяснения. Я связался с владельцем сервера, и мы попытаемся отладить его вместе. Между тем я пробовал второй обход (8-бит) и работал как шарм. – stmpakir