Google云端硬盘异步上传方法

时间:2013-04-19 03:51:59

标签: c# .net google-drive-api google-api-dotnet-client

我有一个使用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云端硬盘之前,我使用的是FTP解决方案,它允许异步上传操作。我希望在文件上传时包含进度条,但我无法弄清楚是否有异步调用InserMediaUpload的方法。这样的能力存在吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

我们今天早些时候announced 1.4.0-beta version。 1.4.0-beta有很多很棒的功能,包括UploadAsync,可选择获取取消令牌。 另请查看我们的新Media wiki page

答案 1 :(得分:1)

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

更新(2015年6月): 我们确实在2年多前添加了对UploadAsync的支持。使用ExponentialBackoffPolicy支持服务器错误。

答案 2 :(得分:0)

我知道它已经很晚了..但添加进度条非常简单。

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

MS.data.in$age <- as.numeric(sub(".*-(\\d+).*", "\\1", MS.data.in$age))
MS.data.in$age
#[1] 10 20 30 40 50 60

 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");
   }
}