You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Delphi调用Dropbox File Request API实现文件收集

问题:如何用Delphi调用Dropbox API创建文件请求,让第三方通过指定代码上传文件?

我需要通过编程方式发起文件请求并接收第三方上传的文件。请问如何通过Delphi调用Dropbox API创建文件请求(对应Dropbox的文件请求功能),以便第三方能通过以下代码将文件发送给我:

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;

解决方案

一、核心说明

Dropbox的文件请求功能需要调用API v2的file_requests/create接口实现创建操作,你提供的上传代码基于已废弃的API v1,后续需注意迁移。以下是完整实现步骤:

二、前置准备

  1. 在Dropbox开发者平台创建Scoped Access类型的应用,开启file_requests.write权限(用于创建文件请求)和files.content.write权限(用于接收上传文件)。
  2. 获取有效的OAuth 2.0访问令牌(API v2仅支持OAuth2认证)。

三、Delphi创建文件请求的代码实现

使用TIdHTTP发起API v2请求:

procedure TDropbox.CreateFileRequest(const ATitle: string; const ADestinationPath: string);
const
  API_V2_CREATE_URL = 'https://api.dropboxapi.com/2/file_requests/create';
var
  HTTPS: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  RequestBody: TStringStream;
  Response: string;
begin
  HTTPS := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPS);
  RequestBody := TStringStream.Create;
  try
    // 配置SSL协议(必须用TLS 1.2及以上)
    SSLHandler.SSLOptions.Method := sslvTLSv1_2;
    HTTPS.IOHandler := SSLHandler;
    
    // 设置请求头
    HTTPS.Request.ContentType := 'application/json';
    HTTPS.Request.CustomHeaders.Add('Authorization: Bearer ' + FOAuth2AccessToken);

    // 构造请求体:指定文件请求标题和文件存储路径
    RequestBody.WriteString(Format('{"title": "%s", "destination": "%s"}', [ATitle, ADestinationPath]));
    RequestBody.Position := 0;

    // 发送POST请求
    Response := HTTPS.Post(API_V2_CREATE_URL, RequestBody);
    // 响应结果包含文件请求的链接、ID等信息,可按需解析使用
    ShowMessage('文件请求创建成功:' + Response);
  finally
    RequestBody.Free;
    HTTPS.Free;
  end;
end;

四、关于上传代码的迁移提示

你提供的Upload方法基于已废弃的API v1,官方已停止维护,建议迁移到API v2版本,以下是对应实现:

procedure TDropbox.UploadV2(const AFileName: String; const ADropboxSavePath: String);
const
  API_V2_UPLOAD_URL = 'https://content.dropboxapi.com/2/files/upload';
var
  HTTPS: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  FileStream: TFileStream;
  Response: string;
begin
  if not FileExists(AFileName) then
    raise EInOutError.CreateFmt('文件 %s 不存在', [AFileName]);

  HTTPS := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPS);
  FileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    SSLHandler.SSLOptions.Method := sslvTLSv1_2;
    HTTPS.IOHandler := SSLHandler;
    
    // 设置请求头
    HTTPS.Request.ContentType := 'application/octet-stream';
    HTTPS.Request.CustomHeaders.Add('Authorization: Bearer ' + FOAuth2AccessToken);
    HTTPS.Request.CustomHeaders.Add(Format('Dropbox-API-Arg: {"path": "%s", "mode": "add"}', [ADropboxSavePath]));

    // 上传文件
    Response := HTTPS.Post(API_V2_UPLOAD_URL, FileStream);
    ShowMessage('文件上传成功:' + Response);
  finally
    FileStream.Free;
    HTTPS.Free;
  end;
end;

五、关键注意点

  • 创建文件请求时,destination参数指定的Dropbox文件夹必须预先存在,否则会返回错误。
  • 若要让第三方无需令牌即可上传,可在创建文件请求时设置is_open为true,生成公开上传链接。
  • API v1已完全废弃,务必尽快迁移到API v2,避免服务中断。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:40:35