2016-07-27 5 views
0

TIdHtttpでPUTを使用してファイルをアップロードしたいと思います。私はRemy LebeauからPUTを使わないという答えを見つけましたが、代わりにPOSTを使用しました。PUTを使用してTIdHTTPでファイルをアップロードする

私は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を取得します。

私は既にブラウザ(Advanced REST client - chrome)からリクエストを直接実行しようとしましたが、それは動作します。 APIが動作しています。メッセージのヘッダそれが動作です:

 
PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1 
HOST: www.XXXXXXXXXXXXX.com 
authorization: Basic XXXXXXXXXXXXX 
content-type: multipart/form-data; boundary=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL 
accept: application/json 
accept-encoding: gzip, deflate 
accept-language: en-US,en;q=0.8 
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 
content-length: 1936 

------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL 
Content-Disposition: form-data; name="fileUpload2"; filename="teste.po" 
Content-Type: application/octet-stream 

コードここではないですが、はい、私は認証情報を設定し、それが働いている私は他の人がAPIに呼び出して使用することができますので、私はこれを確認することができます。私が試したhttp://docs.transifex.com/api/translations/#put

方法:

1)この1本の返却500 - Internal Server Error

更新

これは私がPUTを使用しようとしているAPIです。私はコンテンツタイプがapplication/octet-streamのDSオブジェクトを作成しようとしました。しかし、私は同じエラーを持っています。

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; 
+0

設定したすべてのヘッダーをフルコードで入力してください。 'AddFile'手続きの最後のパラメータは' application/octet-stream'でなければなりません。 'TIdMultiPartFormDataStream'を使わない場合、' ContentType'を手動で設定しないでください。さもなければ私が言及したように 'RequestContentType'関数を使用してください。 'TIdHTTP.Request.RawHeadersからヘッダーを保存します。Text'を使用するか、 'OnIdHTTPHeadersAvailable'イベントを使用してヘッダーを比較してください。あなたがまったく同じ要求を送るなら、それは働かなければなりません。 – smooty86

答えて

4

このAPIは仕様上壊れています。 multipart/form-dataPUTを混ぜるべきではありません。あなたはこの

FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite); 
FHTTP.Put('http://...', FPutData, FResponseStream); 

のようにそれを送信する必要があります。しかし、それは動作しない場合、問題はあなたが正しいContentTypeを設定しないということはおそらくあり、それは境界が含まれていません。 DSあなたTIdMultiPartFormDataStreamあるこの

FHTTP.Request.ContentType:=DS.RequestContentType; 

のようにそれを修正。

+2

'TIdMultipartFormDataStream'は' Post() 'と一緒に使うことを意図しています。そのバージョンの' Post() 'は' ContentType'を内部的に境界線で設定します。 'TIdMultipartFormDataStream'を' Put() 'した場合は、' ContentType'を手動で設定する必要があり、 'RequestContentType'を使用する必要があります。 –

+0

これは機能しません!私はまだ悪い要求を取得します。私は両方のケースを試みた。私は奇妙な質問の詳細情報。 –

0

問題が見つかりました。それは私が設定しなければならない境界線についてだった。結果は次のようになります。

DS := TIdMultiPartFormDataStream.Create; 
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream'); 
try 
    FHttpComunication.Request.ContentType := 'multipart/form-data; boundary=' + DS.Boundary; 
    FHttpComunication.Request.AcceptEncoding := ''; 
    FHttpComunication.Request.Accept := ''; 
    FHttpComunication.Request.Host := ''; 
    FHttpComunication.Request.UserAgent := ''; 

    FHttpComunication.Put(UrlCmd, DS, Response); 
finally 
    DS.Free; 
    Response.Free; 
end; 
+1

どういう驚き!私はあなたに昨日 'RequestContentType'を使用するように指示し、あなたは手動で再度境界を設定しました... – smooty86

+0

oooo申し訳ありません!私はそれを見ませんでした。答えを作成し、私はそれを受け入れるよ! –

+0

それは答えに記載されています... – smooty86

関連する問題