-->

如何上传文件通过德尔福7收存箱?(how to upload file to dropbox via

2019-07-18 22:22发布

我尝试上传文件到Dropbox的。
我用的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;

我得到了“400错误的请求”。
所有令牌是正确的(其他的API效果很好)。
如何通过这个API的参数?

Answer 1:

试试这个:

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;


Answer 2:

  1. 使用%26 ,而不是&oauth_signature参数。 有一个参数的两个值由concated &符号。
  2. 通过PASS文件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; 


文章来源: how to upload file to dropbox via Delphi 7?