我正在尝试将应用程序中拍摄的一些照片上传到Google云端硬盘。
我创建了一个项目和一个服务帐户密钥,并且启用了Google Drive API。
我的代码段如下:
// sfilePath = "/storage/emulated/0/Xyz";
// sfileName = "PIC_17";
final accountCredentials = new ServiceAccountCredentials.fromJson({
"private_key_id": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
"client_email": "...@...gserviceaccount.com",
"client_id": "...apps.googleusercontent.com",
"type": "service_account"
});
AuthClient client = await clientViaServiceAccount(
accountCredentials,
['https://www.googleapis.com/auth/drive']);
var driveApi = ga.DriveApi(client);
var fileToUpload = File(sfilePath + sfileName + '.jpg');
var response = await driveApi.files.create(ga.File()..name = 'my_file.jpg',
uploadMedia: ga.Media(fileToUpload.openRead(), fileToUpload.lengthSync()));
print(response.toJson());
运行程序后
print(response.toJson())
结果:
{id: ..., kind: drive#file, mimeType: image/jpeg, name: my_file.jpg}
一段时间后,我看到仪表板上Google Drive API的请求号有所增加,但是在我的Google Drive中找不到my_file.jpg。
可能是什么问题?我该如何测试会发生什么,确切的反应是什么?
我的解决方案来自:Dart: upload .jpg file to google Drive
谢谢, IMozes
答案 0 :(得分:0)
我认为问题在于您正在使用服务帐户。 使用服务帐户密钥时,Apis可以运行,但是您的文件不是存储在您的Google云端硬盘中,而是存储在单独的Google云端硬盘中。 要检查这一点,您可以添加以下代码
var fileList = await driveApi.files.list();
fileList.files.forEach((file) => print('---${file.name})'));
使用服务帐户密钥,您将只有一个名为“ welcome ..”的文件。
解决方案是将Firebase身份验证与Google API密钥一起使用,其代码如下:
final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = GoogleSignIn(
scopes: ['https://www.googleapis.com/auth/drive'],
);
final GoogleSignInAccount googleSignInAccount = await
googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);
AuthResult authResult = await _auth.signInWithCredential(credential);
var client = GoogleHttpClient(await googleSignInAccount.authHeaders);
var driveApi = drive.DriveApi(client);
此处定义了{@ {3}}
的GoogleHttpClient答案 1 :(得分:0)
您必须与带凭据的client_email共享上传映像的驱动器文件夹