我正在尝试使用上传文件到Google云端硬盘 Delphi中的RestAPI。每件事情都运行正常,但文件正在上传到带有Untitled名称的Google驱动器中。
addLikes:function (id, auth_id) {
this.unlike = true;
this.$http.patch('/api/likes/' + id + '/' + auth_id).then(function(response) {
this.fetchComment(topic_id)
}, function(response) {
return response;
})
},
unLike:function(id) {
this.$http.delete('/api/likes/' + id).then(function (response) {
this.fetchComment(topic_id)
}, function(response) {
return response;
})
},
有人可以建议如何提供文件名/上传与google驱动器相同名称的文件。
答案 0 :(得分:1)
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而不是。
答案 1 :(得分:0)
检查Google Drive REST API参考 https://developers.google.com/drive/v2/web/manage-uploads#multipart。 你必须发送“元数据”。有2个选项。您完成该简单上传,然后调用另一个请求来更新此文件的metada。或者您可以执行多部分上传并添加参数。 这个应该可以工作,但似乎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;