How to upload a file to Dropbox through Delphi 7?

I am trying to upload a file to Dropbox.
I am using dropbox api https://www.dropbox.com/developers/reference/api#files-POST

procedure TDropbox.Upload2; const URL = 'https://api-content.dropbox.com/1/files/dropbox/'; var Response: String; Params: TIdMultipartFormDataStream; https: TIdHTTP; SslIoHandler: TIdSSLIOHandlerSocket; begin https := TIdHTTP.Create(nil); Params := TIdMultipartFormDataStream.Create(); try SslIoHandler := TIdSSLIOHandlerSocket.Create(https); SslIoHandler.SSLOptions.Method := sslvTLSv1; SslIoHandler.SSLOptions.Mode := sslmUnassigned; https.IOHandler := SslIoHandler; Params.AddFormField('oauth_signature_method', 'PLAINTEXT'); Params.AddFormField('oauth_consumer_key', FAppKey); Params.AddFormField('oauth_token', FOAuth.AccessToken); Params.AddFormField('oauth_signature', FAppSecret + '&' + FOAuth.AccessTokenSecret); Params.AddFile('file', 'C:\test.txt', 'application/octet-stream'); https.Post(URL + 'test.txt', Params); finally FreeAndNil(https); FreeAndNil(Params); end; end; 

I have a "400 Bad request".
All tokens are correct (other api work well). How to pass parameters for this api?

+6
source share
2 answers

Try this instead:

 procedure TDropbox.Upload(const AFileName: String); const API_URL = 'https://api-content.dropbox.com/1/files_put/sandbox/'; var URL: String; https: TIdHTTP; SslIoHandler: TIdSSLIOHandlerSocket; begin URL := API_URL+ExtractFileName(AFileName) + '?oauth_signature_method=PLAINTEXT&oauth_consumer_key=' + FAppKey + '&oauth_token=' + FOAuth.AccessToken + '&oauth_signature=' + FAppSecret + '%26' + FOAuth.AccessTokenSecret; https := TIdHTTP.Create(nil); try SslIoHandler := TIdSSLIOHandlerSocket.Create(https); SslIoHandler.SSLOptions.Method := sslvTLSv1; SslIoHandler.SSLOptions.Mode := sslmUnassigned; https.IOHandler := SslIoHandler; https.Post(URL, AFileName); finally FreeAndNil(https); end; end; 
+7
source
  • Use %26 instead of & in the oauth_signature parameter. There are two values ​​in one parameter enclosed by the & symbol.
  • Transfer the file through TMemoryStream .

     procedure TDropbox.Upload(const AFileName: String); const API_URL = 'https://api-content.dropbox.com/1/files_put/sandbox/'; var URL: String; Stream: TMemoryStream; ShortFileName: String; https: TIdHTTP; SslIoHandler: TIdSSLIOHandlerSocket; begin if not FileExists(AFileName) then begin raise EInOutError.CreateFmt('File %s not found', [AFileName]); end; ShortFileName := ExtractFileName(AFileName); URL := API_URL+ShortFileName + '?oauth_signature_method=PLAINTEXT&oauth_consumer_key=' + FAppKey + '&oauth_token=' + FOAuth.AccessToken + '&oauth_signature=' + FAppSecret + '%26' + FOAuth.AccessTokenSecret; https := TIdHTTP.Create(nil); Stream := TMemoryStream.Create; try SslIoHandler := TIdSSLIOHandlerSocket.Create(https); SslIoHandler.SSLOptions.Method := sslvTLSv1; SslIoHandler.SSLOptions.Mode := sslmUnassigned; https.IOHandler := SslIoHandler; Stream.LoadFromFile(AFileName); https.Post(URL, Stream); finally FreeAndNil(Stream); FreeAndNil(https); end; end; 
0
source

All Articles