2013-04-19 2 views
0

У меня есть приложение winforms, которое использует Google Диск для управления файлами. Мой метод загрузки файла достаточно прост:Метод загрузки Async Google Диска

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

Мы по-прежнему не поддерживаем метод UpdateAsync, но если вам нужно обновить индикатор выполнения, вы можете использовать событие ProgressChanged. Помните, что ChunkSize по умолчанию - 10 МБ, поэтому, если вы хотите получать обновления после более коротких периодов, вы должны соответственно изменить ChunkSize. Имейте в виду, что в следующей версии библиотеки, мы также будем поддерживать ошибки сервера (5xx)

UPDATE (июнь 2015): Мы сделали добавить поддержку UploadAsync более 2 лет назад. Также поддерживаются ошибки сервера, используя ExponentialBackoffPolicy.

+0

Спасибо. Я посмотрю на событие ProgressChanged. – MSD

2

Мы только announced 1.4.0-beta version ранее сегодня. 1.4.0-бета обладает множеством замечательных функций, включая UploadAsync, который по желанию получает токен отмены. Посмотрите также в нашем новом Media wiki page.

0

Я знаю, что уже поздно .. но добавление полосы прогресса довольно просто.

Ниже рабочая часть кода для загрузки:

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 
} 
+0

Обязательно удаляйте выделенный выделенный поток. –

 Смежные вопросы

  • Нет связанных вопросов^_^