Webサービスに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
ヘッダーが、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
が、それらのどれも動作を変更せず、エンコードされたファイル名が分割されたときに、私はまだエラーを取得しています。
これは何らかのバグですか、それとも不足していますか?
私のコードは、上記以外のすべてのケースで機能します。
私はIndy10でDelphi XE3を使用しています。
ご回答いただきありがとうございます。私はサーバーの所有者に連絡して、それを一緒にデバッグしようとします。一方、私は2番目の回避策(8ビット)を試して、魅力的に働いた。 – stmpakir