文件正在使用Delphi中的Untitled名称上传到Google驱动器

时间:2016-04-21 14:25:52

标签: rest delphi google-drive-api

我正在尝试使用上传文件到Google云端硬盘     Delphi中的RestAPI。每件事情都运行正常,但文件正在上传到带有Untitled名称的Google驱动器中。

enter image description here 下面是为上传到驱动器而编写的代码。

 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驱动器相同名称的文件。

2 个答案:

答案 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;