Flutter:如何像 WhatsApp 一样备份 Google Drive 上的用户数据?

Ale*_* Lo 9 backup google-drive-api flutter

我想备份用户Google Drive帐户上的备份中的数据并恢复它们。

我见过一些应用程序,例如WhatsApp,允许用户通过 Google Drive 登录并定期备份到用户云。

我不想使用firebase cloud,因为数据是由用户自己访问的,而不是其他用户访问的,如果数据很大,成本会很高。有没有可用的软件包可以做到这一点?或者教程否则如何在颤振中实现这一点?

Oma*_*oud 5

步骤1

您需要已经创建了 Google Firebase 项目,并从 Google Developer Console 启用 Google Drive API。请注意,您需要在 Google Developer Console 中选择与在 Google Firebase 中创建的项目相同的项目。

第2步

您需要使用 google 登录才能获取 googleSignInAccount 并使用依赖项

 googleapis: ^0.54.0  
 googleapis_auth: ^0.2.11 



class GoogleHttpClient extends IOClient {  
 Map<String, String> _headers;  
 GoogleHttpClient(this._headers) : super();  
 @override  
 Future<http.StreamedResponse> send(http.BaseRequest request) =>  
     super.send(request..headers.addAll(_headers));  
 @override  
 Future<http.Response> head(Object url, {Map<String, String> headers}) =>  
     super.head(url, headers: headers..addAll(_headers));  
}
Run Code Online (Sandbox Code Playgroud)

将文件上传到 Google 云端硬盘

_uploadFileToGoogleDrive() async {  
   var client = GoogleHttpClient(await googleSignInAccount.authHeaders);  
   var drive = ga.DriveApi(client);  
   ga.File fileToUpload = ga.File();  
   var file = await FilePicker.getFile();  
   fileToUpload.parents = ["appDataFolder"];  
   fileToUpload.name = path.basename(file.absolute.path);  
   var response = await drive.files.create(  
     fileToUpload,  
     uploadMedia: ga.Media(file.openRead(), file.lengthSync()),  
   );  
   print(response);  
 } 
Run Code Online (Sandbox Code Playgroud)

下载谷歌云端硬盘文件

Future<void> _downloadGoogleDriveFile(String fName, String gdID) async {  
   var client = GoogleHttpClient(await googleSignInAccount.authHeaders);  
   var drive = ga.DriveApi(client);  
   ga.Media file = await drive.files  
       .get(gdID, downloadOptions: ga.DownloadOptions.FullMedia);  
   print(file.stream);  
   
   final directory = await getExternalStorageDirectory();  
   print(directory.path);  
   final saveFile = File('${directory.path}/${new DateTime.now().millisecondsSinceEpoch}$fName');  
   List<int> dataStore = [];  
   file.stream.listen((data) {  
     print("DataReceived: ${data.length}");  
     dataStore.insertAll(dataStore.length, data);  
   }, onDone: () {  
     print("Task Done");  
     saveFile.writeAsBytes(dataStore);  
     print("File saved at ${saveFile.path}");  
   }, onError: (error) {  
     print("Some Error");  
   });  
 } 
Run Code Online (Sandbox Code Playgroud)