Exemplo n.º 1
0
        public async Task ResumableChunkUpload(string filePath)
        {
            using (var client = DriveClient.GetInfo())
            {
                try
                {
                    FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                    FilesResource.CreateMediaUpload request = new FilesResource.CreateMediaUpload(client,
                                                                                                  new Google.Apis.Drive.v3.Data.File
                    {
                        Name    = "new File",
                        Parents = new List <string>()
                        {
                            "1K46j8qE2sOiFAMNvSz21xFxgpVTYlcWm"
                        },
                    },
                                                                                                  stream,
                                                                                                  "video/mpeg4");
                    request.ChunkSize = 1024 * 1024;
                    await request.InitiateSessionAsync();

                    Task <Google.Apis.Upload.IUploadProgress> uploadTask = request.UploadAsync();
                    for (var i = 0; i < 1000; i++)
                    {
                        System.Threading.Thread.Sleep(1000);
                        Console.WriteLine(request.GetProgress().BytesSent);
                    }
                    await uploadTask;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message + " " + e.StackTrace);
                }
            }
        }
Exemplo n.º 2
0
        private void UploadAll()
        {
            try
            {
                UserCredential credential;

                using (var stream =
                           new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
                {
                    string credPath = System.Environment.GetFolderPath(
                        System.Environment.SpecialFolder.Personal);
                    credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");

                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result;
                    Console.WriteLine("Credential file saved to: " + credPath);
                }

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName       = ApplicationName,
                });

                // Define parameters of request.
                FilesResource.ListRequest listRequest = service.Files.List();
                listRequest.PageSize = 10;
                listRequest.Fields   = "nextPageToken, files(id, name)";
                var request = service.Files.List();
                request.Spaces   = "appDataFolder";
                request.Fields   = "nextPageToken, files(id, name)";
                request.PageSize = 10;
                var result     = request.Execute();
                var driveFiles = result.Files.ToList();
                Directory.CreateDirectory("Budgets");
                var localFiles = Directory.EnumerateFiles(_path, "*.sqlite").ToList();
                foreach (var file in localFiles)
                {
                    var fileName = Path.GetFileName(file);
                    if (driveFiles.Any(x => x.Name.Equals(fileName) && File.GetLastWriteTime(file) > x.ModifiedTime))
                    {
                        //UPDATE EXISTING ON DRIVE
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            _budgetList.Add(new Budget(fileName, Path.GetFullPath(file), Path.GetFileNameWithoutExtension(file)));
                            var budget = _budgetList.First(x => x.Name.Equals(fileName));
                            budget.LoadAble = false;
                            budget.State = "Uploading to drive";
                            ListViewBudgets.ItemsSource = _budgetList;
                            ListViewBudgets.Items.Refresh();
                        }));

                        var body = new Google.Apis.Drive.v3.Data.File
                        {
                            Name         = Path.GetFileName(file),
                            Description  = "QuickBudget Database",
                            MimeType     = ".sqlite database",
                            ModifiedTime = File.GetLastWriteTime(file)
                        };
                        var          byteArray = File.ReadAllBytes(file);
                        MemoryStream stream    = new MemoryStream(byteArray);
                        string       id        = result.Files.First(x => x.Name.Equals(body.Name)).Id;
                        FilesResource.UpdateMediaUpload req = service.Files.Update(body, id, stream, GetMimeType(Path.GetFileName(file)));
                        req.Fields = "id";
                        req.Upload();
                        IUploadProgress progress = req.GetProgress();
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            Budget budget = _budgetList.First(x => x.Name.Equals(fileName));
                            budget.LoadAble = true;
                            budget.State = "Ready";
                            ListViewBudgets.ItemsSource = _budgetList;
                            ListViewBudgets.Items.Refresh();
                        }));
                    }
                    else if (!driveFiles.Any(x => x.Name.Equals(fileName)))
                    {
                        //UPLOAD NON-EXISTING TO DRIVE
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            _budgetList.Add(new Budget(fileName, Path.GetFullPath(file), Path.GetFileNameWithoutExtension(file)));
                            var budget = _budgetList.First(x => x.Name.Equals(fileName));
                            budget.LoadAble = false;
                            budget.State = "Uploading to drive";
                            ListViewBudgets.ItemsSource = _budgetList;
                            ListViewBudgets.Items.Refresh();
                        }));
                        var body = new Google.Apis.Drive.v3.Data.File
                        {
                            Name    = Path.GetFileName(file),
                            Parents = new List <string>()
                            {
                                "appDataFolder"
                            },
                            Description  = "QuickBudget Database",
                            MimeType     = ".sqlite database",
                            ModifiedTime = File.GetLastWriteTime(file)
                        };
                        var          byteArray = File.ReadAllBytes(file);
                        MemoryStream stream    = new MemoryStream(byteArray);

                        FilesResource.CreateMediaUpload req = service.Files.Create(body, stream, GetMimeType(Path.GetFileName(file)));
                        req.Fields = "id";
                        req.Upload();
                        IUploadProgress progress = req.GetProgress();
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            var budget = _budgetList.First(x => x.Name.Equals(fileName));
                            budget.LoadAble = true;
                            budget.State = "Ready";
                            ListViewBudgets.ItemsSource = _budgetList;
                            ListViewBudgets.Items.Refresh();
                        }));
                    }
                }
            }
            catch (Exception exception) when(exception is Google.GoogleApiException || exception is HttpRequestException)
            {
                bool retry = false;

                Dispatcher.Invoke((Action)(() =>
                {
                    YesNo yesNo = new YesNo("Quickbudget failed to connect to Google Drive. Do you want to try again?")
                    {
                        Owner = GetWindow(this)
                    };
                    yesNo.ShowDialog();
                    if (yesNo.IsSuccesful)
                    {
                        retry = true;
                    }
                }));
                if (retry)
                {
                    UploadAll();
                }
                else
                {
                    //TODO load local
                }
            }
        }