文件上传到谷歌驱动器与无标题名称在 Delphi

nukf8bse  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(103)

我正试图上传文件到谷歌驱动器使用RestAPI在 Delphi 。一切都工作正常,但文件被安装到谷歌驱动器与无标题的名称。
x1c 0d1x下面是我写的上传到驱动器的代码。

local_filename:= 'D:/Capture.jpg';
{$ENDIF}
  RESTResponseDataSetAdapter.AutoUpdate :=false;
  RESTRequest.Params.Clear;
RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.AddParameter('application/json; charset=utf-8','{"title": "Capture.jpg"}',TRESTRequestParameterKind.pkREQUESTBODY);

  RESTClient.BaseURL := 'https://www.googleapis.com/upload/drive/v2';
  RESTRequest.Resource := '/files?uploadType=multipart';

  upload_stream := TFileStream.Create(local_filename,fmOpenRead);
  upload_stream.Position := 0
 RESTRequest.Addbody(upload_stream, TRESTContentType.ctIMAGE_JPEG);
RESTRequest.Execute;

有人可以建议如何给予一个文件名/上传文件与相同的名称到谷歌驱动器。

zvokhttg

zvokhttg1#

AddBody()似乎取代了AddParameter(),因此您将删除元数据JSON。这在AddBody() documentation中说明:
通常,对AddBody的调用会替换body参数的任何先前值。但是,如果将ABodyContent作为字符串传递,则会追加指定的值,并且生成的请求包含几个主体参数
JSON元数据和JPG文件需要以multipart/related在请求体中一起发送。然而,看看TRESTRequest,我没有看到一种简单的方法来发送这种格式的请求(我可能错了)。您可能必须将整个multipart数据放在一个TStream中,并将其传递给AddBody(),内容类型为TRESTContentType.ctMULTIPART_RELATED。如果您尝试将各个部分作为单独的参数添加,它将不会发送正确的内容类型:
单参数请求使用application/x-www-form-urlencoded,而多参数请求使用multipart/mixed

mpgws1up

mpgws1up2#

检查谷歌驱动器REST API参考https://developers.google.com/drive/v2/web/manage-uploads#multipart。你必须发送“元数据”。有两种选择。您完成了这个简单的上传,然后调用另一个请求来更新这个文件的元数据。或者你可以做多部分上传并添加一个参数。这个方法应该可以工作,但是REST请求似乎不支持这个方法。

RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.Params.AddItem('metadata', '{"title": "YourFileName.dat"}', TRESTRequestParameterKind.pkREQUESTBODY, [], TRESTContentType.ctAPPLICATION_JSON);

所以解决方案是在您请求后更新元数据

var
  s: string
RESTRequest1.Response.GetSimpleValue('id', s);

RESTRequest1.Params.Clear;
RESTClient1.BaseURL := 'https://www.googleapis.com/drive/v2/files/'+s;
RESTRequest1.Resource := '';
RESTRequest1.Method:=TRESTRequestMethod.rmPUT;
RESTRequest1.AddBody('{"title": "Capture.jpg"}', TRESTContentType.ctAPPLICATION_JSON);
RESTRequest1.Execute;

相关问题