我想在TIdHtttp上使用PUT上傳文件。我發現Remy Lebeau的回答是不使用PUT,而是使用POST。使用PUT上傳TIdHTTP文件
但在我的情況下,我無法做到這一點,因爲我使用第三個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 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。
更新
這是我想要使用PUT
的API:http://docs.transifex.com/api/translations/#put
方式,我試圖:
1)這一個返回500 - Internal Server Error
。我嘗試過創建內容類型爲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;
提供包含您設置的所有標題的完整代碼。 「AddFile」過程中的最後一個參數應該是「application/octet-stream」。如果不使用'TIdMultiPartFormDataStream',請勿手動設置'ContentType'。否則使用'RequestContentType'函數,正如我所提到的。從'TIdHTTP.Request.RawHeaders保存你的頭文件。文字「或使用」OnIdHTTPHeadersAvailable「事件並比較您的標題。如果您發送完全相同的請求,它必須工作。 – smooty86