通过REST v3上传的文件显示为" Untitled"

时间:2017-03-18 17:50:51

标签: rest google-api google-drive-api

我正在尝试通过REST(没有SDK)在Drive中创建一个文件,遵循官方API: https://developers.google.com/drive/v3/reference/files/create

所以我遵循两个步骤:

  1. 创建文件元数据(名称等)
  2. 上传文件内容
  3. 第2步就像魅力一样,但是我遇到了第1步的一些问题.Mime类型设置得很好,但至于名字我总是得到"无标题"文件,无论实际名称或类型如何。

    首先我尝试了这个:

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    

    部分工作 - 创建文件,正确设置内容类型(例如,在我在步骤2中写入数据后,我实际上可以在驱动器中预览它),但名称是&#34;无标题&#34;。< / p>

    然后我再次查看文档,发现以下内容: &#34;元数据URI,仅用于元数据请求:POST https://www.googleapis.com/drive/v3/files&#34; - &GT;这将返回404(未找到)。

    在此之后,我在API资源管理器中尝试了API:https://developers.google.com/drive/v3/reference/files/create#try-it 并注意到,该调用实际上是针对另一个URI(该文件已成功创建并按预期命名):

    POST https://www.googleapis.com/upload/drive/v3/files
    Authorization: Bearer <OAuth 2.0 access token here>
    Content-Type: image/png
    
    {
      "name": "test123.png"
    }
    

    当我在我的代码中尝试这个时,我得到400 Bad Request。当然,我还要添加不记名令牌认证。

    我觉得我错过了什么......有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

如果您从API资源管理器获得了成功的元数据POST,然后您的代码发出完全相同的请求,那么当然它必须有效。

您获得标题为&#34;无标题&#34;的文件的原因是你正在POST到内容端点。你说&#34;嘿谷歌,用这个内容创建一个新文件(POST),但没有元数据&#34;。

根据您提供的摘要,我的猜测是您使用了错误的内容类型。对于元数据帖子(https://content.googleapis.com/drive/v3/files),content-type始终为application/json。生成的Drive文件的mime类型应该由json中的mime-type属性设置。

我建议退一步,确保您了解到,在Drive中,文件(由其元数据表示)与文件内容是分开的。阅读&#34;分段上传&#34;如果您想在一次通话中同时提供,或者更好,因为它是一张图片,请阅读有关可恢复上传的内容。

答案 1 :(得分:0)

我也遇到了这个问题。我认为有3个解决方案:

  1. multipart upload https://developers.google.com/drive/v3/web/multipart-upload与文件元数据和实际文件的不同标题一起使用

  2. 在两个请求中上传文件。首先用元数据创建空文件(响应将提供文件的id),然后第二次实际“更新”文件

  3. 使用resumable upload。首先请求“设置元数据”(甚至不创建空文件)并获得“特殊链接”,以发送上传实际文件的请求。此方法还有其他一些功能,例如以块的形式上传。https://developers.google.com/drive/v3/web/resumable-upload

  4. 以下是在Angular 2中实施可恢复上传的另一个问题的链接

    Angular 2+ HTTP POST and GDrive API. Resumable file upload with name

    我希望它可能有用。

答案 2 :(得分:0)

就我而言,Google云端硬盘中的无标题文件仅针对发行版apk创建。通过更新保护规则来解决。我为Google Drive REST API添加了规则:

-keep class com.google.** { *;}
-keep class com.fasterxml.** { *;}