【问题标题】:Attempting a Google Drive partial Download (Flutter) throws a header error尝试 Google Drive 部分下载 (Flutter) 会引发标头错误
【发布时间】:2022-12-16 00:21:44
【问题描述】:

这是我的问题:

我正在使用 Flutter 创建一个基于存储在 Google Drive 上的音频文件的小型应用程序。

我正在使用 drive api 发出我的请求,在我的谷歌登录中使用这些范围:

GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: [
    'email',
    'https://www.googleapis.com/auth/userinfo.profile',
    'https://www.googleapis.com/auth/contacts.readonly',
    'https://www.googleapis.com/auth/drive',
    'https://www.googleapis.com/auth/docs',
    'https://www.googleapis.com/auth/drive.appdata',
  ],
);

我有一个 auth 元素并处理登录和注销。到那时,没有问题。

我还可以使用如下所示的实现来请求我的文件:

  var api = widget.api.getAPI();
  var files = await api.files.list($fields: '*');

这非常有效,也是如此:

  var api = widget.api.getAPI();
  var files = await api.files.get("myFileId"); (//does get a file instance)

但是因为我想检索我的音频文件中包含的一些元数据,并且由于驱动 API 本身不支持提取音频元数据并将其作为谷歌元数据发送,我想我会通过部分下载来提取它在文件本身上。

问题是:我似乎无法让部分下载工作。 Based on the doc,我认为实现看起来像这样:

import 'package:googleapis/drive/v3.dart' as ga;    
(...)
try {
            var partiallyDownloadedFile = await api.files.get(
                "myFileIdHere",
                downloadOptions: ga.PartialDownloadOptions(ga.ByteRange(0, 10))); //should get a ga.Media instance
            print("partial download succeeded");
            print(partiallyDownloadedFile);
            //(...do stuff...)
            return;
          } catch (err) {
            print('Error occured : ');
            print(err);
            return;
          }

但这总是会引发此错误:

ApiRequestError(消息:尝试部分下载但无效 'Content-Range' 标头(原为:空,预期:字节 0-10/)。

我尝试在 Wav 文件和 MP4 文件上使用它。错误总是一样的,这让我相信是我的实现出了问题,但我不确定我应该做什么来修复它。是我的请求缺少标题吗?响应不包括它? 虽然很清楚,但该错误根本无法帮助我解决问题。我似乎找不到任何关于如何进行部分媒体请求的文档。我还没有找到任何可以与之比较的示例项目。

PartialDownloadOptions 没有太多文档。

我可以通过下载链接手动提出部分请求(这是我开始阅读音乐的方式),但驱动 API 应该允许这样做。任何熟悉 Flutter/google API 的人都可以帮助我更正我的实现吗?

【问题讨论】:

  • 我不知道这是否会以任何方式影响这篇文章,但我仍然没有找到解决方案。因此,我一直搁置这个项目,直到今天它仍然让我感到困惑。

标签: flutter dart google-api google-drive-api


【解决方案1】:

编辑:这是由于 Dart google API 中的公共库中的错误,并且由于 Kevmoo 的努力(至少表面上)得到了修复:https://github.com/google/googleapis.dart/issues/462

与通常公开每个标头的 iOS/Android 类型请求相比,这是由于 access-control-expose-header 的浏览器规范而发生的 Content-Range 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2019-10-25
    • 2022-01-02
    • 2023-03-28
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多