谷歌驱动器异步上传方法

本文关键字:方法 异步 驱动器 谷歌 | 更新日期: 2023-09-27 18:09:52

我有一个使用Google Drive来管理文件的winforms应用程序。我的文件上传方法很简单:

    public static File UploadFile(string sourcefile, string description, string mimeType, int attempt)
    {
        try
        {
            string title = Path.GetFileName(sourcefile);
            var file = new File {Title = title, Description = description, MimeType = mimeType};
            byte[] bytearray = System.IO.File.ReadAllBytes(sourcefile);
            var stream = new MemoryStream(bytearray);
            FilesResource.InsertMediaUpload request = DriveService.Files.Insert(file, stream, "text/html");
            request.Convert = false;
            request.Upload();
            File result = request.ResponseBody;
            return result;
        }
        catch (Exception e)
        {
            if(attempt<10)
            {
                return UploadFile(sourcefile, description, mimeType, attempt + 1);
            }
            else
            {
                throw e;
            }
        }
    }

这是可行的,但在使用Google Drive之前,我使用的是FTP解决方案,它允许异步上传操作。我想在文件上传时包括一个进度条,但我不知道是否有办法异步调用InserMediaUpload。这种能力存在吗?

谢谢。

谷歌驱动器异步上传方法

我们今天早些时候刚刚发布了1.4.0测试版。1.4.0-beta有很多很棒的功能,包括UploadAsync,它可以选择获得一个取消令牌。

我们仍然不支持UpdateAsync方法,但是如果你需要更新你的进度条,你可以使用ProgressChanged事件。记住,默认的ChunkSize是10MB,所以如果您希望在较短的时间后获得更新,您应该相应地更改ChunkSize。请注意,在库的下一个版本中,我们还将支持服务器错误(5xx)

2015年6月更新:我们在两年前就添加了对UploadAsync的支持。使用ExponentialBackoffPolicy也支持服务器错误。

我知道有点晚了,但是添加进度条是相当简单的。

下面是用于上传的工作代码:

 public static File uploadFile(DriveService _service, string _uploadFile, string _parent, string _descrp = "Uploaded with .NET!")
 {
    if (System.IO.File.Exists(_uploadFile))
    {
       File body = new File();
       body.Title = System.IO.Path.GetFileName(_uploadFile);
       body.Description = _descrp;
       body.MimeType = GetMimeType(_uploadFile);
       body.Parents = new List<ParentReference>() { new ParentReference() { Id = _parent } };
       byte[] byteArray = System.IO.File.ReadAllBytes(_uploadFile);
       System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
       try
       {
           FilesResource.InsertMediaUpload request = _service.Files.Insert(body, stream, GetMimeType(_uploadFile));
           request.ProgressChanged += UploadProgessEvent;
           request.ChunkSize = FilesResource.InsertMediaUpload.MinimumChunkSize; // Minimum ChunkSize allowed by Google is 256*1024 bytes. ie 256KB. 
           request.Upload();
           return request.ResponseBody;
       }
       catch(Exception e)
       {
           MessageBox.Show(e.Message,"Error Occured");
       }
   }
   else
   {
       MessageBox.Show("The file does not exist.","404");
   }
}

private void UploadProgessEvent(Google.Apis.Upload.IUploadProgress obj)
{
    label1.Text = ((obj.ByteSent*100)/TotalSize).ToString() + "%";
    // update your ProgressBar here
}