Возобновить загрузку Google Drive API - PullRequest
0 голосов
/ 03 июля 2019

Я использую Google Drive API для загрузки файлов с Google Drive, он работает нормально, но я хочу сделать больше функций паузы и возобновления.

Я прочитал страницу с инструкциями Google и нашел поддержку для частичногозагрузки (https://developers.google.com/drive/api/v3/manage-downloads), они сказали: «Вы можете указать часть файла, которую вы хотите загрузить, используя диапазон байтов с заголовком Range», но я не знаю, как это сделать, кто мне может помочь?

Это мой код:

string fileId;
string path;
long bytes;
        private void DownloadWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            DriveService ds = GetService();
            var request = ds.Files.Get(fileId);

            using (var stream = new MemoryStream())
            {

                request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>
                {
                    switch (progress.Status)
                    {
                        case Google.Apis.Download.DownloadStatus.Downloading:
                            {
                                bytes = progress.BytesDownloaded;
                                GoogleDrive.ReportProgress((int)bytes);
                                break;
                            }
                        case Google.Apis.Download.DownloadStatus.Completed:
                            {
                                SaveStream(stream);
                                break;
                            }
                        case Google.Apis.Download.DownloadStatus.Failed:
                            {
                                break;
                            }
                    }
                };
                request.Download(stream);

            }
        }
        private void DownloadWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            label1.Text = e.ProgressPercentage.ToString();
        }
        private void DownloadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }
        private void SaveStream(MemoryStream stream)
        {
            long exlength = 0;
            if (System.IO.File.Exists(path))
            {
                var fileInfo = new FileInfo(path);
                exlength = fileInfo.Length;
            }
            var fileMode = exlength > 0 ? FileMode.Append : FileMode.Create;
            using (FileStream file = new FileStream(path, fileMode, FileAccess.Write))
            {
                stream.WriteTo(file);
            }
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            fileId = "1P2KckTacknNDsONttlzL4GPLSLldzCbA";
            path = "D:\\Data.zip";
            GoogleDrive.RunWorkerAsync();

        }

1 Ответ

0 голосов
/ 05 июля 2019

Уже есть ответ, подобный тому, что вы хотите достичь здесь [1], но с запросом на экспорт. По сути, после получения запроса (и перед его отправкой) вам необходимо установить заголовок Range, как указано в размещенной вами ссылке. Для вашего случая это было бы так:

DriveService ds = GetService(); 
var request = ds.Files.Get(fileId);
//Set the range header
request.Headers.Range = new RangeHeaderValue(from, to);
//More code…
//Send the request
request.Download(stream);

[1] C # - загрузка с Google Диска в байтовых блоках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...