前回の記事で紹介したGoogleDriveAPIのサンプルコードは、ルートディレクトリ直下にアップロードする実装になっている。
しかし、ファイルをアップロードする際は任意のディレクトリにアップロードしたいもの。
指定ディレクトリにアップロードするためには、以下の手順で行える。
指定のディレクトリを取得
効率のよい取得方法が分からなかったので、愚直にルートディレクトリからたどった。
ルートディレクトリ直下のファイル、ディレクトリ一覧は以下のようにして取得できる
com.google.api.services.drive.Drive drive;
...
FileList fileList = drive.files().list().execute();
for(File file : fileList.getItems){
// IDとファイル名
System.out.println(file.getId() + " " + file.getTitle());
}
指定のディレクトリ以下を取得する場合、以下のようにsetQメソッドで親ディレクトリのIDを条件に追加する。
FileList fileList = drive.files().list().setQ( "'" + parent.getId() + "' in parents").execute();
アップロードするファイルの親ディレクトリを指定
目的のディレクトリのFileオブジェクトを取得できたらば、ファイルアップロード時にFile#setParentsメソッドで親ディレクトリを指定すればよい。
File uploadFileMetadata = new File();
...
uploadFileMetadata.setParents( Arrays.asList( new ParentReference().setId( parent.getId())));
はまりどころ
- デフォルトの設定だとGoogleDriveAPIで作成したファイル、ディレクトリしか参照することができない
ブラウザからアップロード先のディレクトリを作っても見えなくてはまった - デフォルトの検索条件だとゴミ箱にあるファイル、ディレクトリもヒットしてしまう
ゴミ箱のファイルを除外するにはsetQメソッドでtrashed = false
を追加する必要がある。親ディレクトリの指定と合わせる場合は以下のようにandで条件を結合する。
setQ( "trashed = false and '" + parent.getId() + "' in parents")
実装されたコード
指定ディレクトリへのアップロードを行うCLIツール。
https://github.com/tsyki/backup-to-google-drive
GoogleDriveUploaderのgetDir, uploadFileで上記処理を実装してある。
参考URL
-
setParentsの引数の作り方
https://github.com/taiProject/taiProject/blob/be62e5a38b2070c072a7d3ecbcdb2b53b4b88c50/dfs/src/main/java/pl/edu/agh/dfs/googledrive/GoogleDriveImpl.java
※GitHubからsetParentsで検索してそれらしいコードを探して見つけた -
ファイル取得時のクエリ指定の方法
https://developers.google.com/drive/v3/web/search-parameters