【问题标题】:Resumable download Google Drive API可恢复下载 Google Drive API
【发布时间】:2019-07-03 13:55:51
【问题描述】:

我正在使用 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();

        }

【问题讨论】:

    标签: c# google-drive-api


    【解决方案1】:

    已经有一个类似于您在此处 [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# - Downloading from Google Drive in byte chunks

    【讨论】:

    • 感谢您回答我的问题,但我在该行中遇到了错误:request.Headers.Range = new RangeHeaderValue(from, to); 错误 CS1061: 'FilesResource.GetRequest' 不包含 'Headers' 的定义并且没有可访问的扩展方法 'Headers ' 可以找到接受“FilesResource.GetRequest”类型的第一个参数(您是否缺少 using 指令或程序集引用?)
    • [1] 有问题,因为下载的文件已损坏。请参阅我对 [1] 帖子的评论...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    相关资源
    最近更新 更多