[Google Drive API v3] JavaでDriveのファイルをダウンロードする

Google Drive API v3（Java）を使用して、
Driveに置かれているファイルをダウンロードする方法
についてご紹介します。

Driveに置かれているファイルをそのままダウンロードする方法と
ファイルの形式を変更してダウンロードする方法についてご紹介します。

Googleスプレットシートなどはそのままダウンロードすることはできませんので、
形式を変更してダウンロードすることになります。

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

|No||目次|
|---|---|---|
|1||[ファイルをダウンロード](#1-ファイルをダウンロード)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
|2||[形式を指定してダウンロード](#2-形式を指定してダウンロード)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[指定可能なMimeType](#23-指定可能なmimetype)|

## 1. ファイルをダウンロード
Driveに置かれているファイルをダウンロードします。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

```
DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY
```

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
ダウンロードしたいファイルのIDを指定してダウンロードします。

サンプルではダウンロードするファイル名を取得していますが、
必要がなければファイル名を直接指定してください。

なお、バイナリ以外のダウンロードできないファイル(スプレットシート等)を指定すると
```
Only files with binary content can be downloaded. Use Export with Docs Editors files.
```
というエラーが返ってきます。
[2. 形式を指定してダウンロード](#2-形式を指定してダウンロード)の方法でダウンロードしてください。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    Drive.Files.Get get = files.get("ファイルID");

    //出力先のファイル
    String fileName = get.execute().getName();
    File outputFile = new File("出力先のフォルダパス"+fileName);

    //inputstreamを取得して、ファイルを出力します
    try(InputStream input = get.executeMediaAsInputStream();
        OutputStream outputStream = new FileOutputStream(outputFile, false)){
        input.transferTo(outputStream);
    }
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/drive/v3/files/{ファイルID}
が実行されます。

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

|メソッド|引数|説明|
|---|---|---|
|setAcknowledgeAbuse|Boolean|ユーザーが既知のマルウェアまたはその他の不正なファイルをダウンロードするリスクを認識しているか|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
  
## 2. 形式を指定してダウンロード
Driveに置かれているファイルをダウンロードします。

Googleドキュメントなど、そのままダウンロードできないファイルの場合にこの方法を使用します。
なお、サポートされているファイルのサイズは**10Mbyte**までだそうです。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_READONLY
```

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
ダウンロードしたいファイルのIDとMimeTypeを指定してダウンロードします。
MimeTypeの指定は、[2.3. 指定可能なMimeType](#23-指定可能なmimetype)を参照ください。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    Drive.Files.Export export = files.export("ファイルID","MimeType");
    
    File outputFile = new File("出力先のファイルパス");
    
    try(InputStream input = export.executeMediaAsInputStream();
        OutputStream outputStream = new FileOutputStream(outputFile, false)){
        input.transferTo(outputStream);
    }
}
```
#### 2.2.1. HTTPリクエスト
GET：　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/export
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

### 2.3. 指定可能なMimeType
ファイルの種類毎に指定可能なMimeTypeの一覧です。

#### 2.3.1. Google ドキュメント

|指定可能な形式|MimeType|拡張子|
|---|---|---|
|Microsoft Word|application/vnd.openxmlformats-officedocument.wordprocessingml.document|.docx|
|OpenDocument|application/vnd.oasis.opendocument.text|.odt|
|Rich Text|application/rtf|.rtf|
|PDF|application/pdf|.pdf|
|Plain Text|text/plain|.txt|
|Web Page (HTML)|application/zip|.zip|
|EPUB|application/epub+zip|.epub|

#### 2.3.2. Google スプレットシート

|指定可能な形式|MimeType|拡張子|
|---|---|---|
|Microsoft Excel|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|.xlsx|
|OpenDocumentファイル形式(ODF)|application/x-vnd.oasis.opendocument.spreadsheet|.ods|
|PDF|application/pdf|.pdf|
|Web Page (HTML)|application/zip|.zip|
|CSV|text/csv|.csv|
|TSV|text/tab-separated-values|.tsv|

#### 2.3.3. Google スライド

|指定可能な形式|MimeType|拡張子|
|---|---|---|
|Microsoft PowerPoint|application/vnd.openxmlformats-officedocument.presentationml.presentation|.pptx|
|OpenDocumentファイル形式(ODF)|application/vnd.oasis.opendocument.presentation|.odp|
|PDF|application/pdf|.pdf|
|テキスト|text/plain|.txt|
|画像(JPEG)|image/jpeg|.jpg|
|画像(PNG)|image/png|.png|
|画像(SVG)|image/svg+xml|.svg|

#### 2.3.4. Google 図形描画

|指定可能な形式|MimeType|拡張子|
|---|---|---|
|PDF|application/pdf|.pdf|
|画像(JPEG)|image/jpeg|.jpg|
|画像(PNG)|image/png|.png|
|画像(SVG)|image/svg+xml|.svg|

#### 2.3.5. Google Apps Script

|指定可能な形式|MimeType|拡張子|
|---|---|---|
|JSON|application/vnd.google-apps.script+json|.json|

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