【发布时间】:2017-02-22 12:01:18
【问题描述】:
我正在尝试为 Web 服务实现 POST。我需要发送一个类型可变的文件(.docx、.pdf、.txt)以及一个 JSON 格式的字符串。
我已成功使用类似于以下的代码发布文件:
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 标头是由 Indy 的 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,失败了。
我尝试更改文件名的编码、AddFile() 过程的AContentType 和ContentTransfer,但这些都没有改变行为,当编码的文件名被拆分时我仍然会出错.
这是某种错误,还是我遗漏了什么?
我的代码适用于除我上面描述的之外的所有情况。
我正在使用带有 Indy10 的 Delphi XE3。
【问题讨论】:
标签: delphi utf-8 indy10 delphi-xe3 idhttp