Dart,Flutter:将.jpg文件上传到Google云端硬盘

时间:2019-05-15 06:25:15

标签: dart upload

我正在尝试将应用程序中拍摄的一些照片上传到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

2 个答案:

答案 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共享上传映像的驱动器文件夹