Flutter - 如何使用 Google Drive API 下载公共文件

Posted

技术标签:

【中文标题】Flutter - 如何使用 Google Drive API 下载公共文件【英文标题】:Flutter - How to download public files using Google Drive API 【发布时间】:2020-12-14 13:35:11 【问题描述】:

我第一次尝试使用 Google API、Google Drive API,我正在使用 Google SignIn 对用户进行身份验证。我在启用 Google Drive API 后创建了 ClientId、ClientSecret 和 Scope,但我不知道如何使用它们。我最终使用 GoogleSignInAccount 的 authHeaders 创建了一个 HTTP 客户端。

我不需要访问或管理我的文件,我只需要经过身份验证,因为我可能需要下载大文件,使用直接链接不起作用,因为它有一个大文件的确认窗口,可以'不会被扫描。

当我尝试使用它的 ID 下载公共文件时,我总是收到以下错误。

class GoogleHttpClient extends IOClient 
  Map<String, String> _headers;

  GoogleHttpClient(this._headers) : super();

  @override
  Future<iostreamedResponse> send(BaseRequest request) =>
      super.send(request..headers.addAll(_headers));

  @override
  Future<Response> head(Object url, Map<String, String> headers) =>
      super.head(url, headers: headers..addAll(_headers));



class GDriveHelper 

  // NOT USING
  //static final clientId = "??????.apps.googleusercontent.com";
  //static final clientSecret = "??????";
  //static final scopes = [ga.DriveApi.DriveFileScope];

  static UserController userController = Get.find();

  static Future<void> download(String fileId) async 

    Map<String, String> headers = await userController.googleSignInAccount.authHeaders;

    var client = GoogleHttpClient(headers);
    var drive = ga.DriveApi(client);

    await drive.files.get(fileId).then((file)

      print("FILE: $file");

    );



  


当我调用该方法时,我得到了这个错误:

await GDriveHelper.download(fileId);
            
DetailedApiRequestError(status: 403, message: Insufficient Permission: Request had insufficient authentication scopes.)

【问题讨论】:

以你的情况为例,当你再次授权范围时,你会得到什么结果?并且作为其他确认,当您将ga.DriveApi.DriveFileScope 修改为ga.DriveApi.DriveScope 时,您将获得什么结果?在这种情况下,请重新授权范围。 我创建了变量范围,但我没有在代码中的任何地方使用它。我不知道我是否必须以及在哪里使用这些变量(clientId、clientSecret 和 scopes)。 感谢您的回复。我注意到您的问题刚刚更新。我为此道歉。在您的脚本中,您在没有使用授权值的情况下进行了测试。如果我的理解是正确的,从您更新的问题来看,例如,使用 API 密钥怎么样?在这种情况下,可以通过GET https://www.googleapis.com/drive/v3/files/[FILEID]?alt=media&amp;key=[YOUR_API_KEY] 之类的简单请求下载公开共享文件。这个怎么样? 感谢您的回复。客户端密钥与 API 密钥不同。您可以在官方文档中查看有关 API 密钥的信息。 Ref 例如,当您获得 API 密钥后,您可以使用简单的 curl 命令下载公开共享文件,例如 curl "https://www.googleapis.com/drive/v3/files/[FILEID]?alt=media&amp;key=[YOUR_API_KEY]" @Tanaike 非常感谢,它成功了,我不认为通过 url 使用这种方式是可能的而且这么容易,请你回答这个问题,以便我接受你的回答吗? 【参考方案1】:

根据您的问题,我可以理解您尝试下载公开共享的文件。从我们的讨论中,我确认没有使用clientIdclientSecretscopes。从这些情况来看,作为一种简单的方法,我建议使用 API 密钥下载公共共享文件。 API 密钥可以下载公开共享的文件。请求可以简单如下。

示例请求:

GET https://www.googleapis.com/drive/v3/files/[FILEID]?alt=media&key=[YOUR_API_KEY]

在此方法中,除了 Google Docs(文档、电子表格、幻灯片等)之外的文件可以通过 Drive API 中的the method of "Files: get" 下载。

当您要下载 Google Docs 文件时,请使用the method of "Files: export",如下所示。

  GET https://www.googleapis.com/drive/v3/files/[FILEID]/export?mimeType=[mimeType]&key=[YOUR_API_KEY]

curl 命令示例:

作为测试,当你使用 curl 时,示例 curl 命令如下。

除 Google Docs 文件外的文件:
curl "https://www.googleapis.com/drive/v3/files/[FILEID]?alt=media&key=[YOUR_API_KEY]"
谷歌文档文件:
curl "https://www.googleapis.com/drive/v3/files/[FILEID]/export?mimeType=[mimeType]&key=[YOUR_API_KEY]"

参考资料:

Using API keys Download files

【讨论】:

以上是关于Flutter - 如何使用 Google Drive API 下载公共文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使用 Google API?

Flutter - 如何使用 Google Drive API 下载公共文件

如何使用Flutter访问Google Drive appdata文件夹文件?

如何在 Flutter 应用程序中获取 Google API 密钥

如何在 Flutter 中添加 XML Google Pay 按钮

Flutter:如何使用新的 Marker API 向 Google Maps 添加标记?