我正试图上传文件到谷歌驱动器使用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;
有人可以建议如何给予一个文件名/上传文件与相同的名称到谷歌驱动器。
2条答案
按热度按时间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。
mpgws1up2#
检查谷歌驱动器REST API参考https://developers.google.com/drive/v2/web/manage-uploads#multipart。你必须发送“元数据”。有两种选择。您完成了这个简单的上传,然后调用另一个请求来更新这个文件的元数据。或者你可以做多部分上传并添加一个参数。这个方法应该可以工作,但是REST请求似乎不支持这个方法。
所以解决方案是在您请求后更新元数据