2015-02-17 1 views
1

Я пытаюсь интегрировать приложение ASP.NET C# с API-интерфейсом Google Диска. Мы успешно сохранили документы в формате pdf на нашей учетной записи накопителя, но теперь мы пытаемся загрузить и загрузить файл.API-интерфейс Google Drive IAuthenticator

Мы делаем звонок, и он возвращает нам данные. Моя проблема заключается в том, что он дает мне несколько ссылок для загрузки, и каждая из этих ссылок (когда используется для извлечения документа) дает сообщение об ошибке «Unauthorized».

В документации упоминается ICredentials, но я ничего не могу найти о том, как создать этот объект ICredentials из нашего ServiceAccountCredential.

Я также видел в документации способ разрешить публичный доступ для извлечения документа, но я пробовал это, и он тоже не работал. Странная вещь - мы можем загрузить миниатюру, но не фактический документ.

Может ли кто-нибудь помочь мне узнать, как получить эти ссылки?

ответ

1

Создание службы привода с использованием учетной записи службы Учетные данные в значительной степени такие же, как с Oauth2.

var service = AuthenticationHelper.AuthenticateServiceAccount("[email protected]eaccount.com",@"C:\Users\HPUser\Downloads\e8bf61cc9963.p12"); 

/// <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; 
      } 

      string[] scopes = new string[] { DriveService.Scope.Drive };  // View analytics data    

      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 = "Drive API Sample", 
       }); 
       return service; 
      } 
      catch (Exception ex) 
      { 

       Console.WriteLine(ex.InnerException); 
       return null; 

      } 

Вышеуказанный метод возвращает сервис, который вы можете использовать для совершения любых других вызовов. Это метод, который я использую для загрузки файла. После того, как вы получите fileresource назад от files.list

var m = service.Files.List().Execute(); 

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

/// <summary> 
     /// Download a file 
     /// Documentation: https://developers.google.com/drive/v2/reference/files/get 
     /// </summary> 
     /// <param name="_service">a Valid authenticated DriveService</param> 
     /// <param name="_fileResource">File resource of the file to download</param> 
     /// <param name="_saveTo">location of where to save the file including the file name to save it as.</param> 
     /// <returns></returns> 
     public static Boolean downloadFile(DriveService _service, File _fileResource, string _saveTo) 
     { 

      if (!String.IsNullOrEmpty(_fileResource.DownloadUrl)) 
      { 
       try 
       { 
        var x = _service.HttpClient.GetByteArrayAsync(_fileResource.DownloadUrl); 
        byte[] arrBytes = x.Result; 
        System.IO.File.WriteAllBytes(_saveTo, arrBytes); 
        return true;     
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("An error occurred: " + e.Message); 
        return false; 
       } 
      } 
      else 
      { 
       // The file doesn't have any content stored on Drive. 
       return false; 
      } 
     } 

код вырванные из учебника Google Drive api C# download

+0

Спасибо за вашу помощь. Позвольте мне еще немного уточнить, какова наша проблема: –

+0

Мы хотели загрузить документ на нашу учетную запись и дать ссылку на скачивание, а затем мы хотим разместить эту ссылку на нашем сайте, чтобы пользователи могли скачать файл. Другой вариант, на который мы надеялись, - это использовать одну из ссылок, чтобы пользователи нашего сайта могли просматривать файл в iframe или что-то в этом роде. Все эти ссылки говорят «несанкционированный», когда мы пытаемся это сделать, так что это все еще не совсем работает так, как нам нужно, чтобы работать. Вы знаете какой-либо способ заставить этот ави-вызов работать таким образом? В очередной раз благодарим за помощь. –

+0

Если вы хотите, чтобы результирующая ссылка для загрузки была доступна для всех, у кого есть ссылка, возможно, вам нужно установить соответствующие разрешения для файлов в момент, когда вы их загружаете. –