Reputation: 515
I try to upload file into dropbox.
I use 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 got "400 Bad request".
All tokens are correct (other api works well).
How pass parameters for this api?
Upvotes: 7
Views: 6906
Reputation: 598448
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;
Upvotes: 8
Reputation: 515
%26
instead &
in oauth_signature
parameter. There is two values in one parameter concated by &
symbol.Pass file via 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;
Upvotes: 0