[Google Drive API v3] Javaでファイルをアップロード・生成・コピー・更新・削除する

Google Drive API v3（Java）を使用して、
Driveにファイルをアップロード・生成・更新・コピー・削除する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[ファイルをアップロード](#1-ファイルをアップロード)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[ファイルを生成](#2-ファイルを生成)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[ファイルをコピー](#3-ファイルをコピー)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|
|4||[ファイルを置き換える](#4-ファイルを置き換える)|
||1|[スコープ](#41-スコープ)|
||2|[実行](#42-実行)|
||3|[レスポンスの内容](#43-レスポンスの内容)|
|5||[ファイル情報を更新](#5-ファイル情報を更新)|
||1|[スコープ](#51-スコープ)|
||2|[実行](#52-実行)|
||3|[レスポンスの内容](#53-レスポンスの内容)|
|6||[ファイルを削除](#6-ファイルを削除)|
||1|[スコープ](#61-スコープ)|
||2|[実行](#62-実行)|
||3|[レスポンスの内容](#63-レスポンスの内容)|
|7||[Google DriveでサポートされるMimeType](#7-google-driveでサポートされるmimetype)|
|8||[よく使うMimeType](#8-よく使うmimetype)|


## 1. ファイルをアップロード
Driveにファイルをアップロードします。

アップロードするファイルの最大ファイルサイズは**5,120GB**です。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

setFieldsでレンスポンスで取得したいフィールド（[File](#file)）を指定します。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

#### File.setMimeType
File.setMimeType()でアップロード後のファイルのMimeTypeを指定できます。
指定するMimeTypeは、[7. Google DriveでサポートされるMimeType](#7-google-driveでサポートされるmimetype)を参照ください。

・ファイルをそのままアップロードする場合
　setMimeTypeは必要ありません。
 
・ファイル形式を変換してアップロードする場合
　setMimeTypeにMimeTypeを指定します。
　例えば、ExcelファイルをGoogleスプレットシートとしてアップロードしたい場合、
　setMimeType("application/vnd.google-apps.spreadsheet");
　new InputStreamContent("application/vnd.ms-excel",input);
　と指定します。
　InputStreamContentに指定するMimeTypeは[8. よく使うMimeType](#8-よく使うmimetype)にまとめました。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    File file = new File();
    file.setName("アップロード後のファイル名");
    //file.setMimeType("アップロード後のMimeType");
    
    try(FileInputStream input = new FileInputStream("アップロードするファイルパス")){
        InputStreamContent content = new InputStreamContent("アップロードするファイルのMimeType", input);
        
        Drive.Files.Create create = files.create(file,content);
        create.setFields("*");
        
        File res = create.execute();
        System.out.println(res);
    }
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/upload/drive/v3/files
が実行されます。

#### 1.2.2. クエリパラメータ
Drive.Files.Createのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setUploadType|String|URIへの[アップロードリクエストタイプ](#アップロードリクエストのタイプ)|
|setIgnoreDefaultVisibility|Boolean|作成されたファイルに対するドメインのデフォルトの可視性設定を無視するか|
|setKeepRevisionForever|Boolean|新しいヘッド リビジョンに「keepForever」フィールドを設定するか|
|setOcrLanguage|String|画像インポート時のOCR処理の言語コード|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setUseContentAsIndexableText|Boolean|アップロードされたコンテンツをインデックス可能なテキストとして使用するか|

#### アップロードリクエストのタイプ

|タイプ|説明|
|---|---|
|media|簡単なアップロード<br>メタデータなしでメディアのみ|
|multipart|マルチパートアップロード<br>メディアとそのメタデータの両方を1つのリクエストでアップロード|
|resumable|再開可能なアップロード<br>少なくとも 2つの一連のリクエストを使用して、再開可能な方法でファイルをアップロード|

#### 1.2.3. リクエストボディ
Fileのsetメソッドにより、リクエストボディを設定できます。

|フィールド|メソッド|引数|説明|
|---|---|---|---|
|anchor|setAnchor|String|JSON文字列として表されるドキュメントの領域|
|content|setContent|String|コメントのプレーンテキストの内容|
|quotedFileContent|setQuotedFileContent|[QuotedFileContent](#quotedfilecontent)|コメントが参照するファイルのコンテンツ|

#### QuotedFileContent

|メソッド|引数|説明|
|---|---|---|
|setMimeType|String|引用されたコンテンツのMIMEタイプ
|setValue|String|引用した内容|

### 1.3. レスポンスの内容

#### File

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|id|getId|String|ファイルのID|
|seetName|getSeetName|String|ファイルの名前|
|mimeType|getMimeType|String|ファイルの MIMEタイプ|
|description|getDescription|String|ファイルの簡単な説明|
|copyRequiresWriterPermission|getCopyRequiresWriterPermission|Boolean|このファイルをコピー、印刷、またはダウンロードするオプションを読者とコメント投稿者に対して無効にするか|
|contentHints|getContentHints|[ContentHints](#contenthints)|ファイルの内容に関する追加情報|
|writersCanShare|getWritersCanShare|Boolean|権限のみを持つユーザーがwriterファイルの権限を変更できるか|
|parents|getParents|List\<String\>|ファイルを含む親フォルダーのID|
|folderColorRgb|setFolderColorRgb|String|フォルダーまたはフォルダーへのショートカットの色|
|starred|getStarred|Boolean|ユーザーがファイルにスターを付けているか|
|trashed|getTrashed|Boolean|ファイルが明示的に、またはゴミ箱に入れられた親フォルダーからゴミ箱に入れられたか|
|createdTime|getCreatedTime|String|ファイルが作成された時刻|
|modifiedTime|getModifiedTime|String|ファイルが誰かによって最後に変更された時刻|
|viewedByMeTime|getViewedByMeTime|String|ユーザーがファイルを最後に表示した時刻|
|originalFilename|getOriginalFilename|String|アップロードされたコンテンツの元のファイル名|
|properties|getProperties|Map\<String,String\>|すべてのアプリに表示される任意のキーと値のペアのコレクション|
|appProperties|getAppProperties|Map\<String,String\>|要求元のアプリにとってプライベートな任意のキーと値のペアのコレクション|
|shortcutDetails|getShortcutDetails|[ShortcutDetails](#shortcutdetails)|ショートカットファイルの詳細|
|contentRestrictions|getContentRestrictions|List\<[ContentRestriction](#contentrestriction)\>|ファイルのコンテンツへのアクセスに対する制限|

#### ContentHints

|メソッド|戻り値|説明|
|---|---|---|
|getIndexableText|String|フルテキストクエリを改善するためにファイルのインデックスを作成するテキスト|
|getThumbnail|[Thumbnail](#thumbnail)|ファイルのサムネイル|

#### Thumbnail

|メソッド|戻り値|説明|
|---|---|---|
|getImage|String|Base64でエンコードされたサムネイル データ|
|getMimeType|String|サムネイルの MIMEタイプ|

#### ShortcutDetails

|メソッド|戻り値|説明|
|---|---|---|
|getTargetId|String|このショートカットが指すファイルのID|

#### ContentRestriction

|メソッド|戻り値|説明|
|---|---|---|
|geteReadOnly|Boolean|ファイルの内容が読み取り専用か|
|getReason|String|ファイルの内容が制限されている理由|
|getOwnerRestricted|Boolean|コンテンツ制限を、ファイルを所有するユーザーのみが変更または削除できるか|

## 2. ファイルを生成
Driveに空のファイル(メタデータ)を生成します。
そのため、ファイルを指定してアップロードすることはしません。

下記画像のように「＋新規」ボタンを押して、Googleスプレットシートなどを
選択した場合と同じような動作だと思ってください。

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/c31a13b6-7d37-a6c2-01e9-ad832d24d1cd.png">

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

setFieldsでレンスポンスで取得したいフィールド（[File](#file)）を指定します。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

File.setMimeType()で指定するMimeTypeは
[7. Google DriveでサポートされるMimeType](#7-google-driveでサポートされるmimetype)を参照ください。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    File file = new File();
    file.setName("生成するファイル名");
    file.setMimeType("生成するMimeType");
    
    Drive.Files.Create create = files.create(file);
    create.setFields("*");
    
    File res = create.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/drive/v3/files
が実行されます。

#### 2.2.2. クエリパラメータ
Drive.Files.Createのsetメソッドにより、クエリパラメータを追加できます。

[1.2.2. クエリパラメータ](#122-クエリパラメータ)と同じです。

#### 2.2.3. リクエストボディ
Fileのsetメソッドにより、リクエストボディを設定できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

### 2.3. レスポンスの内容

#### File

[1.3. レスポンスの内容](#13-レスポンスの内容)と同じです。

## 3. ファイルをコピー
Drive上にあるファイルをコピーします。

### 3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_PHOTOS_READONLY
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 3.2. 実行

setFieldsでレンスポンスで取得したいフィールド（[File](#file)）を指定します。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

なお、[1. ファイルをアップロード](#1-ファイルをアップロード)のように
File.setMimeType()で指定してコピーの際に形式を変更することはできません。
例えば、Excelファイルをコピーの際にGoogleスプレットシートにするなど。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();

    File file = new File();
    file.setName("コピー後のファイル名");
    
    Drive.Files.Copy copy = files.copy("コピー元のファイルID", file);
    copy.setFields("*");
    
    File res = copy.execute();
    System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/copy
が実行されます。

#### 3.2.2. クエリパラメータ
Drive.Files.Copyのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setIgnoreDefaultVisibility|Boolean|作成されたファイルに対するドメインのデフォルトの可視性設定を無視するか|
|setKeepRevisionForever|Boolean|新しいヘッドリビジョンに「keepForever」フィールドを設定するか|
|setOcrLanguage|String|画像インポート時のOCR処理の言語コード|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|

#### 3.2.3. リクエストボディ
Fileのsetメソッドにより、リクエストボディを設定できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

### 3.3. レスポンスの内容

#### File

[1.3. レスポンスの内容](#13-レスポンスの内容)と同じです。

## 4. ファイルを置き換える
Driveのファイルを別のファイルに置き換えます。

置き換えるファイルの最大ファイルサイズは**5,120GB**です。

### 4.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_SCRIPTS
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 4.2. 実行

setFieldsでレンスポンスで取得したいフィールド（[File](#file)）を指定します。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    File file = new File();
    file.setName("更新後のファイル名");
    
    try(FileInputStream input = new FileInputStream("更新するファイルパス")){
        InputStreamContent content = new InputStreamContent("更新するファイルのMimeType", input);
        
        Drive.Files.Update update = files.update("ファイルID", file, content);
        update.setFields("*");
        
        File res = update.execute();
        System.out.println(res);
    }
}
```
#### 4.2.1. HTTPリクエスト
PATCH：https:\//www.googleapis.com/upload/drive/v3/files/{ファイルID}
が実行されます。

#### 4.2.2. クエリパラメータ
Drive.Files.Updateのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setUploadType|String|URIへの[アップロードリクエストタイプ](#アップロードリクエストのタイプ)|

#### 4.2.3. リクエストボディ
Commentのsetメソッドにより、リクエストボディを設定できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

### 4.3. レスポンスの内容
Fileのsetメソッドにより、リクエストボディを設定できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

## 5. ファイル情報を更新
Driveのファイル情報を更新します。

### 5.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_SCRIPTS
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 5.2. 実行
サンプルではファイル名を変更しています。

setFieldsでレンスポンスで取得したいフィールド（[File](#file)）を指定します。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

なお、[1. ファイルをアップロード](#1-ファイルをアップロード)のように
File.setMimeType()で指定してファイルの形式を変更することはできません。
例えば、ExcelファイルをGoogleスプレットシートにするなど。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    File file = new File();
    file.setName("新しいファイル名");

    Drive.Files.Update update = files.update("ファイルID", file);
    update.setFields("*");
    
    File res = update.execute();
    System.out.println(res);
}
```
#### 5.2.1. HTTPリクエスト
PATCH：https:\//www.googleapis.com/drive/v3/files/{ファイルID}
が実行されます。

#### 5.2.2. クエリパラメータ
Drive.Files.Updateのsetメソッドにより、クエリパラメータを追加できます。

[4.2.2. クエリパラメータ](#422-クエリパラメータ)と同じです。

#### 5.2.3. リクエストボディ
Fileのsetメソッドにより、リクエストボディを設定できます。

[1.2.3. リクエストボディ](#123-リクエストボディ)と同じです。

### 5.3. レスポンスの内容

#### File

[1.3. レスポンスの内容](#13-レスポンスの内容)と同じです。

## 6. ファイルを削除
Driveにあるファイルを削除します。

### 6.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 6.2. 実行
削除したいコメントがあるファイルのIDとコメントIDを指定します。

コメントIDが自身のコメントではない場合は削除されません。
削除に失敗した場合のみ例外を出力します。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    Drive.Files.Delete delete = files.delete("ファイルID");
    
    delete.execute();
}
```
#### 6.2.1. HTTPリクエスト
DELETE：　https:\//www.googleapis.com/drive/v3/files/{ファイルID}
が実行されます。

#### 6.2.2. クエリパラメータ
Drive.Files.Deleteのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|

#### 6.2.3. リクエストボディ
リクエストボディはありません。

### 6.3. レスポンスの内容

成功した場合は何も返しません。
失敗した場合は例外を出力します。


## 7. Google DriveでサポートされるMimeType
Google DriveでサポートされるMimeType一覧です。

|MimeType|説明|
|---|---|
|application/vnd.google-apps.audio||
|application/vnd.google-apps.document|Googleドキュメント|
|application/vnd.google-apps.drive-sdk|サードパーティのショートカット|
|application/vnd.google-apps.drawing|Google 図形描画|
|application/vnd.google-apps.file|Googleドライブファイル|
|application/vnd.google-apps.folder|Googleドライブフォルダ|
|application/vnd.google-apps.form|Googleフォーム|
|application/vnd.google-apps.fusiontable|Google フュージョン テーブル|
|application/vnd.google-apps.jam|Google Jamboard|
|application/vnd.google-apps.mail-layout|Email layout|
|application/vnd.google-apps.map|Googleマイマップ|
|application/vnd.google-apps.photo|Googleフォト|
|application/vnd.google-apps.presentation|Google スライド|
|application/vnd.google-apps.script|Google Apps スクリプト|
|application/vnd.google-apps.shortcut|Google Shortcut|
|application/vnd.google-apps.site|Google サイト|
|application/vnd.google-apps.spreadsheet|Google スプレッドシート|
|application/vnd.google-apps.unknown||
|application/vnd.google-apps.video||

## 8. よく使うMimeType
よく使いそうなMimeTypeを一覧にまとめました。

ここにない拡張子のMimeTypeは、IANAの公式なサイトから探してください。
https://www.iana.org/assignments/media-types/media-types.xhtml

|種類|MimeType|拡張子|
|---|---|---|
|AVI: Audio Video Interleave|video/x-msvideo|.avi|
|ビットマップ画像|image/bmp|.bmp|
|カスケーディングスタイルシート (CSS)|text/css|.css|
|カンマ区切り値 (CSV)|text/csv|.csv|
|Microsoft Word|application/msword|.doc|
|Microsoft Word (OpenXML)|application/vnd.openxmlformats-officedocument.wordprocessingml.document|.docx|
|グラフィック交換形式 (GIF)|image/gif|.gif|
|ハイパーテキストマークアップ言語 (HTML)|text/html|.htm .html|
|アイコン形式|image/vnd.microsoft.icon|.ico|
|Java Archive (JAR)|application/java-archive|.jar|
|JPEG 画像|image/jpeg|.jpeg .jpg|
|JavaScript|text/javascript|.js|
|JSON 形式|application/json|.json|
|MP3 音声|audio/mpeg|.mp3|
|MPEG 動画|video/mpeg|.mpeg|
|OpenDocuemnt プレゼンテーション文書|application/vnd.oasis.opendocument.presentation|.odp|
|OpenDocuemnt 表計算文書|application/vnd.oasis.opendocument.spreadsheet|.ods|
|OpenDocument テキスト文書|application/vnd.oasis.opendocument.text|.odt|
|Portable Network Graphics|image/png|.png|
|Adobe Portable Document Format (PDF)|application/pdf|.pdf|
|Microsoft PowerPoint|application/vnd.ms-powerpoint|.ppt|
|Microsoft PowerPoint (OpenXML)|application/vnd.openxmlformats-officedocument.presentationml.presentation|.pptx|
|リッチテキスト形式 (RTF)|application/rtf|.rtf|
|Scalable Vector Graphics (SVG)|image/svg+xml|.svg|
|テキストファイル (一般に ASCII or ISO 8859-n)|text/plain|.txt|
|Waveform 音声形式|audio/wav|.wav|
|Microsoft Excel|application/vnd.ms-excel|.xls|
|Microsoft Excel (OpenXML)|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|.xlsx|

<br>
<br>
おしまい。。