Проблема с загрузкой файлов из gDrive с помощью Google API для .NET - PullRequest
0 голосов
/ 16 марта 2019

Уже несколько лет у меня есть приложение, с помощью которого пользователи могут загружать данные из gDrive. Данные могут быть из собственных электронных таблиц Google (gSheets) или из таких файлов, как txt, csv, xlsx. Внезапно, так как иногда на этой неделе файлы больше не могут быть загружены, хотя с нашей стороны ничего не изменилось. Когда я пытаюсь загрузить файл, я получаю содержимое HTML-страницы, которая в основном представляет собой экран входа в систему. Однако содержимое в gSheets все еще можно загрузить , поэтому это не может быть связано с некоторыми проблемами доступа к учетной записи службы, которую я использую. Я также могу подтвердить, что файлы все еще доступны этой учетной записи службы. Я использую этот код для загрузки файлов:

        String serviceAccountEmail = this.apiConfig.ClientIdEmail;
        Byte[] keyFile = this.apiConfig.FileP12;

        var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential = new ServiceAccountCredential(
           new ServiceAccountCredential.Initializer(serviceAccountEmail)
           {
               Scopes = new[] { DriveService.Scope.Drive, DriveService.Scope.DriveFile }
           }.FromCertificate(certificate));

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

        var response = service.HttpClient.GetByteArrayAsync(exportUrl).Result;
        Stream downloadStream = new MemoryStream(response);

«ExportUrl» имеет формат

https://docs.google.com/a/<domain.com>/uc?id=<fileId>&export=download&gid=0

и когда я пробую этот URL в браузере, я могу загрузить файл без проблем. В то же время я пытался с последними dll от NuGet (версия 1.38) для Google.Apis.Drive.v2 и Google.Apis.Drive.v3. У кого-нибудь есть идея, почему эти загрузки вдруг перестали работать?

1 Ответ

0 голосов
/ 19 марта 2019

Тем временем я нашел решение. Оказывается, при загрузке файлов необходимо использовать другой URL:

    String serviceAccountEmail = this.apiConfig.ClientIdEmail;
    Byte[] keyFile = this.apiConfig.FileP12;

    var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

    ServiceAccountCredential credential = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer(serviceAccountEmail)
       {
           Scopes = new[] { DriveService.Scope.Drive, DriveService.Scope.DriveFile }
       }.FromCertificate(certificate));

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

    //get file handler
    Google.Apis.Drive.v2.Data.File file = service.Files.Get(this.uniqueKey).Execute();
    if (!file.MimeType.Equals("application/vnd.google-apps.spreadsheet"))
    {
        //for files use another Url
        exportUrl = file.DownloadUrl;
    }
    var response = service.HttpClient.GetByteArrayAsync(exportUrl).Result;
    Stream downloadStream = new MemoryStream(response);
...