我正在用Dart编码,需要使用OAuth2.0从Google GDrive下载文件(即图像文件)。我在代码中使用 Dart drive_v2_api_browser 客户端库后拥有下载 URL 的位置。
我尝试将其直接传递给"src"属性
_image = new ImageElement(src: file.downloadUrl, width: file.imageMediaMetadata.width, height: file.imageMediaMetadata.height);
_image.onLoad.listen(onData, onError: onError, onDone: onDone, cancelOnError: true);
但这产生了 403 禁止错误。那时我意识到我需要发出"授权的GET请求"。所以我尝试按照 Dart Auth pub 包 https://pub.dartlang.org/packages/google_oauth2_client 上列出的示例进行操作,但我不明白它要求什么。
这就是我正在尝试的:
var auth = new oauth.SimpleOAuth2(_picker.Token.data);
var request = new HttpRequest();
request.onLoad.listen(onData_Request, onError: onError_Request, onDone: onDone_Request, cancelOnError: true);
request.open("request", file.downloadUrl);
auth.authenticate(request).then((request) => request.send());
但它一直给我一个错误:
令 牌。。。。访问控制允许方法不允许方法请求。
有没有人有一个通过Dart GDrive api下载文件的工作示例,而不是OAuth2.0?
更新:在君特·佐赫鲍尔的帮助下,我能够继续并转换斑点,如下所示:
将此行添加到请求对象:
_downloadRequest.responseType = "blob";
允许我使用文件阅读器:
void onData_Request(Event e) {
Blob response = _downloadRequest.response;
final FileReader reader = new FileReader();
reader.onLoad.listen((e) {
_handleData(reader);
});
reader.readAsArrayBuffer(response);
}
void _handleData(FileReader reader) {
Uint8List uintlist = new Uint8List.fromList(reader.result);
String charcodes = new String.fromCharCodes(uintlist);
_loadImage(_image, charcodes, 225, 225);
}
void _loadImage(ImageElement imageE, String data, int iWidth, int iHeight) {
_imageAsbase64 = window.btoa(data);
_image = new ImageElement(src: "data:image/png;base64," + _imageAsbase64, width: iWidth, height: iHeight);
_image.onLoad.listen(onData, onError: onError, onDone: onDone, cancelOnError: true);
}
void onData(Event e) {
print("success: ");
_context.drawImage(_image, 0, 0);
}
正如错误消息所说request
不是有效的HTTP方法。你需要像GET
、PUT
、POST
、DELETE
、...
另请参阅 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html