我的问题是:
我正在创建一个基于存储在谷歌驱动器上的音频文件的小应用程序,在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的人都可以帮助我纠正我的实现吗?
1条答案
按热度按时间qni6mghb1#
编辑:这是由于Dart google API中的commons库中的一个错误,由于Kevmoo的努力(至少表面上)得到了修复:https://github.com/google/googleapis.dart/issues/462
这是由于
access-control-expose-header
的浏览器规范而发生的内容范围错误,而iOS/Android类型的请求通常会暴露每个标题。