Выгрузка данных на общий диск с помощью служебной учетной записи в java

Я хочу загрузить файлы на общий диск с помощью java. Я создал учетную запись службы и предоставил общий доступ к общему диску (имя DB-Drive) с адресом учетной записи службы.

Глобальные переменные

private static HttpTransport httpTransport;
private static Drive drive;

Основная функция (инициализация и перечисление файлов)

    httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    Credential credential = authorize();
    drive = new Drive.Builder(httpTransport, JacksonFactory.getDefaultInstance(), credential).setApplicationName(
                    "Quickstart").build();

    uploadFile();

    FileList result = drive.files().list().execute();
    List<File> files = result.getFiles();
    if (result == null || result.isEmpty()) {
        System.out.println("No files found.");
      } else {
        System.out.println("Files:");
        for (File file : files) {
             System.out.printf("%s %s \n", file.getName(),file.getId());
                }
            }
        } 

Код авторизации

        GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("resources/credentials.json"))
                .createScoped(Collections.singleton(DriveScopes.DRIVE_FILE));

        return credential;

Код загрузки

 String folderId = "***DB-Drive id****";
        File fileMetadata = new File();
        fileMetadata.setName("photo.jpg");
        fileMetadata.setParents(Collections.singletonList(folderId));
        java.io.File filePath = new java.io.File("/home/*****/Downloads/qck_1552369371.jpeg");
        FileContent mediaContent = new FileContent("image/jpeg", filePath);
        File file = drive.files().create(fileMetadata, mediaContent)
                .setFields("id, parents")
                .execute();
        System.out.println("File ID: " + file.getId());
        return file;

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

Я добавляю полный поток: -

1.) Я создаю учетную запись службы, используя шаги, указанные на странице https://developers.google.com/identity/protocols/oauth2/service-account Я выбрал проект, дал описание и все остальное.

2.) Я не давал делегирование уровня домена учетной записи службы, а использовал общий диск DB (общий диск) с адресом учетной записи службы (который был упомянут в файле credentials.json как client_email *****. Gserviceaccount.com)

3.) Затем я использовал приведенный выше код для загрузки файла, запрашивающего учетную запись службы для загрузки файла на общий диск, то есть DB-Drive, указав идентификатор DB-Drive в качестве родительского идентификатора файла.

4.), но файл по-прежнему загружается на диск учетной записи службы, он не связывается с общим диском.

5.) DB-Drive - это родительская папка (единственная папка).

Любые зацепки будут большим подспорьем.


person Arpit Pruthi    schedule 10.08.2020    source источник
comment
Просмотр вашего полного кода, включая слияние кода создания документа службы с вашим кодом, может помочь, особенно определение drive.   -  person ziganotschka    schedule 10.08.2020
comment
Надеюсь, теперь все понятно @ziganotschka.   -  person Arpit Pruthi    schedule 10.08.2020
comment
Я считаю, что ваша ошибка возникает из-за того, что вы не определяете supportsAllDrives=true. Пожалуйста, проверьте его без учетной записи службы, из Попробуйте этот API.   -  person ziganotschka    schedule 10.08.2020
comment
Клиент Java имеет параметр setSupportsTeamDrives для функции file.create. Я не обнаружил, что этот атрибут поддерживает AllDrives.   -  person Arpit Pruthi    schedule 10.08.2020
comment
См. здесь.   -  person ziganotschka    schedule 10.08.2020
comment
Эта опция недоступна setSupportsAllDrives, доступна только setSupportsTeamDrives .. Я использую compile 'com.google.api-client: google-api-client: 1.23.0' compile 'com.google.oauth-client: google- oauth-client-jetty: 1.23.0 'compile' com.google.apis: google-api-services-drive: v3-rev110-1.23.0 '   -  person Arpit Pruthi    schedule 10.08.2020


Ответы (1)


Как указывает @ziganotschka, вам нужно установить supportsAllDrives в значение true, если вы создаете файл на общем диске. Параметр setSupportsTeamDrives клиента Java устарел. Вместо этого используйте _ 3_ в значение true.


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

  • Изолируйте проблему
  • Спросите себя - проблема связана с использованием учетной записи службы или чем-то еще?
  • Для этого протестируйте тот же запрос без учетной записи службы.
  • If the service account turns out to be the culpit
    • Verify that you enabled domain-wide delegation correctly in the GCP console
    • Убедитесь, что вы указали правильные области для делегированного сервисного аккаунта в консоли администратора.
  • Убедитесь, что ваша реализация кода верна
  • Если проблема не связана с учетной записью службы - убедитесь, что это связано с синтаксисом кода или с запросом.
  • For this, use the Try this API tool to test your request without coding
    • If the issue is coding related - debug your code
    • Если проблема связана с запросом, действуйте в соответствии с ошибкой, которую возвращает вам Попробуйте этот API.
  • If you receive a 404 File not found error - it either means that
    • the file is located on a shared Drive (in this case you have to set supportsAllDrives to true as mentioned above)
    • или fileId неверен
    • Или файл недоступен для учетной записи, которую вы используете для аутентификации
person Community    schedule 10.08.2020
comment
Этот параметр недоступен setSupportsAllDrives, доступен только setSupportsTeamDrives .. Я использую compile 'com.google.api-client: google-api-client: 1.23.0' compile 'com.google.oauth-client: google- oauth-client-jetty: 1.23.0 'compile' com.google.apis: google-api-services-drive: v3-rev110-1.23.0 ' - person Arpit Pruthi; 10.08.2020
comment
И @Aerials @ziganotschka, когда я пытаюсь использовать для перечисления содержимого /*.setTeamDriveId("shared drive id") .setCorpora("drive") .setSupportsTeamDrives(true) .setIncludeTeamDriveItems(true)*/, я получаю сообщение об ошибке, что общий диск не найден - person Arpit Pruthi; 10.08.2020
comment
@ArpitPruthi, вы хотите использовать устаревший метод: supportsTeamDrives. Если Gooogle отказался от него, он вам не поможет. Прочтите описание необязательного параметра supportsTeamDrives здесь . Это означает, что вы можете обновить клиент до последней версии. - person Aerials; 10.08.2020
comment
Я попытался обновить java-клиент, и у меня есть supportsAllDrives, но все равно не повезло, он не может загрузить данные на общий диск. Я создал этот общий диск вручную и добавил учетную запись службы в качестве диспетчера содержимого на этот диск (если это вызывает любой вопрос). - person Arpit Pruthi; 10.08.2020
comment
Подводя итог: 1. Вам нужно использовать только .setIncludeTeamDriveItems(true), а не .setIncludeTeamDriveItems(true). 2. Если вы получаете сообщение об ошибке, что диск не найден - это означает, что либо введенный вами идентификатор неверен, либо вы неправильно предоставили доступ к диску для учетной записи службы. Предлагаю вам еще раз протестировать этот API - это поможет вам проверить правильность установки идентификатора диска и других параметров и сузить источник ошибки. - person ziganotschka; 10.08.2020
comment
Большое спасибо @ziganotschka и Aerials, это сработало. Я давал неправильный идентификатор диска, мой плохой. Спасибо за вашу помощь - person Arpit Pruthi; 11.08.2020