TIdHtttp で PUT を使用してファイルをアップロードしたいと考えています。Remy Lebeau から、PUT を使用せずに POST を使用するようにという回答が見つかりました。
しかし、私の場合は、3 番目の API を使用していて、PUT を使用する必要があると指定されているため、それを行うことはできません。POST を使用しようとすると、メソッドが許可されていないというメッセージが返されます。
基本的に、私は次のようなことをしようとしています:
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
しかし、私がそれをすると、500 - Internal server error
.
私が削除した場合:
FHttpComunication.Request.ContentType := 'multipart/form-data';
私は得る400 - Bad Request
。
私はすでにブラウザー (高度な REST クライアント - クロム) から直接要求を実行しようとしましたが、動作します。したがって、APIは機能しています。動作時のメッセージのヘッダーは次のとおりです。
PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1 ホスト: www.XXXXXXXXXXXXX.com 承認: 基本 XXXXXXXXXXXXX コンテンツ タイプ: マルチパート/フォーム データ。境界=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL 受け入れる: アプリケーション/json 受け入れエンコーディング: gzip、デフレート 受け入れる言語: en-US,en;q=0.8 ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/51.0.2704.103 Safari/537.36 コンテンツの長さ: 1936 ------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL Content-Disposition: フォームデータ。name="fileUpload2"; ファイル名="teste.po" コンテンツ タイプ: アプリケーション/オクテット ストリーム
コードはここにありませんが、はい、承認情報を構成しました。機能しています。他の API 呼び出しを使用できるため、これを確認できます。
アップデート
これは私が使用しようとしている API ですPUT
: http://docs.transifex.com/api/translations/#put
私が試した方法:
1) この 1 つのリターン500 - Internal Server Error
. コンテンツタイプのDSオブジェクトも作成してみましたapplication/octet-stream
。しかし、同じエラーが発生しました。
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'multipart/form-data');
try
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
Result := Response.DataString;
finally
Response.Free;
DS.Free;
end;
2)回答で提案された方法ですが、機能していません。私もエラーになりました500
。
PutData := TFileStream.Create('C:\Users\r.rezino\Desktop\teste.po', fmOpenRead or fmShareDenyWrite);
Response := TStringStream.Create;
try
FHttpComunication.Request.ContentType := 'multipart/form-data'; //I tried with and without it
FHttpComunication.Put(UrlCmd, PutData, Response);
Result := Response.DataString;
finally
Response.Free;
PutData.Free;
end;