2021年4月2日

Drive API Client Library for Javaで遊んだのでまとめます。

環境
- Java 11
- Spring Boot 2.4.4
- Google Auth Library 0.25.2
- Drive API Client Library for Java v3-rev20210315-1.31.0

GCPコンソール側の設定

google drive の Quickstart(サービスアカウント編) を参考にさせていただきました。 GCPコンソールでの設定は上記の記事をみてください。

依存関係の追加

Google Auth LibraryとDrive API Client Library for Javaを依存関係に追加します。

dependencies {
  ...
	implementation "com.google.apis:google-api-services-drive:$googleApiServicesDriveVersion"
	implementation "com.google.auth:google-auth-library-oauth2-http:$googleAuthLibraryOAuth2HttpVersion"
  ...
}

Credentialの作成

Google Drive APIにリクエストするときにクレデンシャル情報を渡す必要があります。GCPコンソールからダウンロードしたサービスアカウントキーファイル(JSON)からインスタンスを作成します。

GoogleCredentials credentials;
try (InputStream inputStream = new ClassPathResource(CREDENTIALS_FILE_PATH).getInputStream()) {
    credentials = ServiceAccountCredentials.fromStream(inputStream).createScoped(SCOPES);
}

Google Driveで遊ぶ

親ディレクトリにあるファイル一覧取得、ファイルのアップロード、ファイルのダウンロードを行なっています。

@Service
public class FileServiceImpl implements FileService {

    private static final Logger LOG = LoggerFactory.getLogger(FileServiceImpl.class);

    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private final GDriveProperties gDriveProperties;

    public FileServiceImpl(GDriveProperties gDriveProperties) {
        this.gDriveProperties = gDriveProperties;
    }

    @Override
    public void list(GoogleCredentials credentials) throws IOException, GeneralSecurityException {
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
        Drive service = new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, requestInitializer)
                .setApplicationName("Google Drive Sandbox")
                .build();

        FileList result = service.files().list().setPageSize(10).execute();
        List<File> files = result.getFiles();
        if (CollectionUtils.isEmpty(files)) {
            LOG.info("No files found.");
            return;
        }
        LOG.info("Files:");
        files.forEach(file -> LOG.info("file name: {}, id: {}\\n", file.getName(), file.getId()));
    }

    @Override
    public void upload(GoogleCredentials credentials) throws IOException, GeneralSecurityException {
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
        Drive service = new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, requestInitializer)
                .setApplicationName("Google Drive Sandbox")
                .build();

        File fileMetadata = new File();
        fileMetadata.setName("create.txt");
        fileMetadata.setParents(Collections.singletonList(gDriveProperties.getParentDirId()));
        FileContent mediaContent = new FileContent("text/plain", new ClassPathResource("/static/create.txt").getFile());
        File file = service.files().create(fileMetadata, mediaContent)
                .setFields("id, parents")
                .execute();

        LOG.info("Uploaded: file id: {}\\n", file.getId());
    }

    @Override
    public void download(GoogleCredentials credentials) throws IOException, GeneralSecurityException {
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
        Drive service = new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, requestInitializer)
                .setApplicationName("Google Drive Sandbox")
                .build();

        File file = service.files().get(gDriveProperties.getDownloadFileId()).execute();
        LOG.info("Downloaded: file id: {}, file name: {}", file.getId(), file.getName());
    }
}

ほぼ各ライブラリのREADME.mdを見ながら実装したのでそこまで解説することはないです。詳しくはGitHubレポジトリ を見てください。

実行結果

正常に動いているようです。

.   ____          _            __ _ _
/\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |_\\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::                (v2.4.4)

2021-04-02 17:38:16.412  INFO 8930 --- [           main] c.b.googledrivesandbox.Application       : Starting Application using Java 11.0.2
2021-04-02 17:38:16.414  INFO 8930 --- [           main] c.b.googledrivesandbox.Application       : No active profile set, falling back to default profiles: default
2021-04-02 17:38:16.798  INFO 8930 --- [           main] c.b.googledrivesandbox.Application       : Started Application in 0.672 seconds (JVM running for 1.172)
2021-04-02 17:38:17.548  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : Files:
2021-04-02 17:38:17.548  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create2.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2

2021-04-02 17:38:17.549  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create1.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1

2021-04-02 17:38:17.549  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0

2021-04-02 17:38:17.823  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : Downloaded: file id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2, file name: create2.txt
2021-04-02 17:38:18.185  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : Files:
2021-04-02 17:38:18.185  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create2.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2

2021-04-02 17:38:18.185  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create1.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1

2021-04-02 17:38:18.185  INFO 8930 --- [           main] c.b.g.service.impl.FileServiceImpl       : file name: create.txt, id: 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0

Links