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



我正在尝试按照官方 API 通过 REST(无 SDK)在云端硬盘中创建一个文件: https://developers.google.com/drive/v3/reference/files/create

所以我遵循两个步骤:

  1. 创建文件元数据(名称等)
  2. 上传文件内容

步骤2 就像一个魅力,但是我在步骤 1 中遇到了一些问题。Mime类型设置得很好,但至于名称,无论实际名称或类型如何,我总是得到"无标题"文件。

首先我尝试了这个:

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

部分工作 - 文件已创建,内容类型设置正确(例如,在步骤 2 中写入数据后,我实际上可以在云端硬盘中预览它),但名称为"无标题"。

然后我又看了一下文档,发现以下内容: " 元数据 URI,对于仅元数据请求:POST https://www.googleapis.com/drive/v3/files " --> 这将返回 404(未找到)。

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

POST https://content.googleapis.com/drive/v3/files
Content-Type: application/json
{
"name": "test123.png"
}

当我在我的代码中尝试此操作时,我收到 400 个错误请求。当然,我还添加了持有者令牌身份验证。

我觉得我错过了什么...谁能帮忙?

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

  1. 对文件元数据和实际文件使用具有不同标头的multipart uploadhttps://developers.google.com/drive/v3/web/multipart-upload

  2. 分两个请求上传文件。首先使用元数据创建空文件(响应将提供文件的 ID),其次实际"更新"文件

  3. 使用resumable upload.第一个请求"设置元数据"(甚至不会创建空文件)并获得"特殊链接",以发送请求以上传实际文件。这种方法还有其他一些功能,比如在chunks.https://developers.google.com/drive/v3/web/resumable-upload中上传。

这是另一个问题的链接,在 Angular 2 中实现了可恢复上传

Angular 2+ HTTP POST 和 GDrive API。带名称的断点续传文件

我希望它可能有用。

好吧,如果你有一个成功的元数据 POST 从 API 资源管理器,然后你的代码发出完全相同的请求,那么它当然必须工作。

您获得标题为"无标题"的文件的原因是您正在发布到内容终结点。您说的是"嘿Google,使用此内容创建一个新文件(POST),但没有元数据"。

从您提供的片段中,我的猜测是您使用了错误的内容类型。对于元数据发布 (https://content.googleapis.com/drive/v3/files),content-type始终application/json。生成的云端硬盘文件的 mime 类型应由 json 中的 mime 类型属性进行设置。

我建议您退后一步,确保您了解,在云端硬盘中,文件(由其元数据表示)与文件内容是分开的。如果您想在单个调用中同时提供两者,请阅读有关"分段上传"的信息,或者更好的是因为它是图像,请阅读有关可恢复上传的信息。

就我而言,Google云端硬盘中的无标题文件仅用于发布apk。通过更新保护规则进行修复。我为 Google Drive REST API 添加了规则:

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

最新更新