1

Я пытаюсь отправить файлы с помощью Google Диска Google, но я не могу найти документацию о том, как выполнять C# Загрузка файлов с использованием учетной записи службы проверки подлинности.Google API для загрузки файлов с использованием учетной записи службы проверки подлинности

Я загрузил библиотеку Daimto, однако он загружает с использованием класса DriveService, когда мы используем аутентификацию ClientId и ClientSecret. Но используя аутентификацию для службы учетной записи, он возвращается в класс PlusService и не находит способ загружать файлы таким образом.

Может кто-нибудь мне помочь? С наилучшими пожеланиями

Использование аутентификации учетной записи службы

public PlusService GoogleAuthenticationServiceAccount() 
    { 
     String serviceAccountEmail = "[email protected]account.com"; 

     //var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable); 
     var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable); 

     ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       Scopes = new[] { PlusService.Scope.PlusMe } 
      }.FromCertificate(certificate)); 

     // Create the service. 
     var service = new PlusService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Plus API Sample", 
     }); 

     return service; 
    } 

Использование аутентификации ClientId и ClientSecret

public DriveService GoogleAuthentication(string userClientId, string userSecret) 
    { 
     //Scopes for use with the Google Drive API 
     string[] scopes = new string[] { DriveService.Scope.Drive, DriveService.Scope.DriveFile }; 
     // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
     UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = userClientId, ClientSecret = userSecret }, scopes, Environment.UserName, CancellationToken.None, new FileDataStore("Daimto.GoogleDrive.Auth.Store")).Result; 

     DriveService service = new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Drive API Sample" 
     }); 

     return service; 
    } 

метод Daimto класс, который делает загрузить файл на Google диск DaimtoGoogleDriveHelper.uploadFile (_service, FileName, item.NomeArquivo, directoryId);

Как вы можете видеть, библиотека Daimto имеет способ загрузки, однако использует параметр _service, который является типом DriveService, который является тем, что возвращается методом GoogleAuthentication. Но метод GoogleAuthenticationServiceAccount возвращает тип PlusService и несовместим с типом DriveService.

+0

Где вы загрузили "Daimto" Библиотеку? ничего не мог найти об этом. Этот другой вопрос может помочь вам в этом: http://stackoverflow.com/questions/16324093/how-use-google-oauth2-using-serviceaccount-in-net – Gerardo

+0

Не совсем уверен, что я бы назвал его библиотекой больше образца проект https://github.com/LindaLawton/Google-Dotnet-Samples/tree/master/Google-Drive – DaImTo

+0

кстати она, но все равно :) – DaImTo

ответ

1

Я не уверен, какой из моих руководств вы следуете. Но ваш первый кусок кода использует PlusService, который вы должны использовать DriveService. Любые запросы, которые вы вносите в приводном API Google должен идти хотя DriveService

Аутентификация в Google диск с учетной записью службы:

/// <summary> 
     /// Authenticating to Google using a Service account 
     /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount 
     /// </summary> 
     /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param> 
     /// <param name="keyFilePath">Location of the Service account key file downloaded from Google Developer console https://console.developers.google.com</param> 
     /// <returns></returns> 
     public static DriveService AuthenticateServiceAccount(string serviceAccountEmail, string keyFilePath) 
     { 

      // check the file exists 
      if (!File.Exists(keyFilePath)) 
      { 
       Console.WriteLine("An Error occurred - Key file does not exist"); 
       return null; 
      } 

      //Google Drive scopes Documentation: https://developers.google.com/drive/web/scopes 
      string[] scopes = new string[] { DriveService.Scope.Drive, // view and manage your files and documents 
              DriveService.Scope.DriveAppdata, // view and manage its own configuration data 
              DriveService.Scope.DriveAppsReadonly, // view your drive apps 
              DriveService.Scope.DriveFile, // view and manage files created by this app 
              DriveService.Scope.DriveMetadataReadonly, // view metadata for files 
              DriveService.Scope.DriveReadonly, // view files and documents on your drive 
              DriveService.Scope.DriveScripts }; // modify your app scripts  

      var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable); 
      try 
      { 
       ServiceAccountCredential credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail) 
        { 
         Scopes = scopes 
        }.FromCertificate(certificate)); 

       // Create the service. 
       DriveService service = new DriveService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Daimto Drive API Sample", 
       }); 
       return service; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.InnerException); 
       return null; 

      } 
     } 
    } 

Загрузить файл:

private static string GetMimeType(string fileName) 
     { 
      string mimeType = "application/unknown"; 
      string ext = System.IO.Path.GetExtension(fileName).ToLower(); 
      Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
      if (regKey != null && regKey.GetValue("Content Type") != null) 
       mimeType = regKey.GetValue("Content Type").ToString(); 
      return mimeType; 
     } 

     /// <summary> 
     /// Uploads a file 
     /// Documentation: https://developers.google.com/drive/v2/reference/files/insert 
     /// </summary> 
     /// <param name="_service">a Valid authenticated DriveService</param> 
     /// <param name="_uploadFile">path to the file to upload</param> 
     /// <param name="_parent">Collection of parent folders which contain this file. 
     ///      Setting this field will put the file in all of the provided folders. root folder.</param> 
     /// <returns>If upload succeeded returns the File resource of the uploaded file 
     ///   If the upload fails returns null</returns> 
     public static File uploadFile(DriveService _service, string _uploadFile, string _parent) { 

      if (System.IO.File.Exists(_uploadFile)) 
      { 
       File body = new File(); 
       body.Title = System.IO.Path.GetFileName(_uploadFile); 
       body.Description = "File uploaded by Diamto Drive Sample"; 
       body.MimeType = GetMimeType(_uploadFile); 
       body.Parents = new List<ParentReference>() { new ParentReference() { Id = _parent } }; 

       // File's content. 
       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.Upload(); 
        return request.ResponseBody; 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("An error occurred: " + e.Message); 
        return null; 
       } 
      } 
      else { 
       Console.WriteLine("File does not exist: " + _uploadFile); 
       return null; 
      }   

     } 

Код загрузки является то же самое, если вы используете Oauth2 или учетную запись службы, нет никакой разницы.

код вырванные из Google Drive .net образца на Github Учебное пособие: Google Drive API with C# .net – Download