如何通过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,后续需注意迁移。以下是完整实现步骤:
二、前置准备
- 在Dropbox开发者平台创建Scoped Access类型的应用,开启
file_requests.write权限(用于创建文件请求)和files.content.write权限(用于接收上传文件)。 - 获取有效的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
相关产品推荐
相关产品推荐

