我正在嘗試將POST
應用於Web服務。我需要發送一個類型可變的文件(.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
標頭使用EncodeHeader()
函數由Indy的TIdFormDataField
類編碼。當帖子失敗時,標題中的編碼文件名將被拆分,而不是拆分的成功帖子。
例如:
Επιστολή εκπαιδευτικο.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
,但這些都不改變行爲,我仍然得到錯誤,當編碼的文件名是分裂的。
這是一種錯誤,還是我錯過了什麼?
我的代碼適用於除上述情況外的每種情況。
我使用Delphi XE3與Indy10。
非常感謝@Remy的回答和所有的解釋。我已與服務器所有者聯繫,我們將嘗試一起調試它。與此同時,我嘗試了第二種解決方法(8位),並像魅力一樣工作。 – stmpakir