尝试Google云端硬盘部分下载(Flutter)会引发标题错误

lfapxunr  于 2022-12-19  发布在  Flutter
关注(0)|答案(1)|浏览(105)

我的问题是:
我正在创建一个基于存储在谷歌驱动器上的音频文件的小应用程序,在Flutter。
我正在使用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元素,可以处理签入和 checkout 。在此之前,没有问题。
我还可以使用如下所示的实现来请求我的文件:

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;
          }

但这总是会抛出以下错误:
ApiRequest错误(消息:尝试部分下载,但获得无效的“Content-Range”标头(原为:空,应为:字节0-10/)。)
我试着在Wav文件和MP4文件上使用它。错误总是一样的,这让我相信是我的实现出了问题,但我不确定我应该做些什么来修复它。是我的请求缺少了头文件吗?响应不包括它吗?虽然非常清楚,这个错误根本不能帮助我解决我问题。我似乎找不到任何关于如何处理部分媒体请求的文档。我还没有找到任何可以与之比较的示例项目。
PartialDownloadOptions没有太多文档。
我可以通过下载链接手工制作一个部分请求(这是我开始阅读音乐的方式),但驱动器API应该允许这样做。任何熟悉Flutter/Google API的人都可以帮助我纠正我的实现吗?

qni6mghb

qni6mghb1#

编辑:这是由于Dart google API中的commons库中的一个错误,由于Kevmoo的努力(至少表面上)得到了修复:https://github.com/google/googleapis.dart/issues/462
这是由于access-control-expose-header的浏览器规范而发生的内容范围错误,而iOS/Android类型的请求通常会暴露每个标题。

相关问题