ファイルのダウンロードとエクスポート

Google Drive API は、次の表に示すように、複数の種類のダウンロードとエクスポートのアクションをサポートしています。

ダウンロード アクション
alt=media URL パラメータを指定して files.get メソッドを使用する BLOB ファイル コンテンツ。
alt=media URL パラメータを指定した revisions.get メソッドを使用して、以前のバージョンの Blob ファイル コンテンツを取得します。
webContentLink フィールドを使用して、ブラウザで Blob ファイルのコンテンツを取得します。
長時間実行オペレーション中に files.download メソッドを使用して Blob ファイルの内容を取得します。Google Vids ファイルをダウンロードできるのはこの方法のみです。
エクスポート アクション
files.export メソッドを使用して、アプリで処理できる形式の Google Workspace ドキュメント コンテンツ。
exportLinks フィールドを使用してブラウザで Google Workspace ドキュメントのコンテンツを表示する。
exportLinks フィールドを使用して、ブラウザで以前のバージョンの Google Workspace ドキュメントのコンテンツを取得します。
長時間実行オペレーション中に files.download メソッドを使用して Google Workspace ドキュメントのコンテンツを取得する。

ファイル コンテンツをダウンロードまたはエクスポートする前に、files リソースの capabilities.canDownload フィールドを使用してユーザーがファイルをダウンロードできることを確認します。

ここで説明するファイル形式(BLOB や Google Workspace ファイルなど)については、ファイル形式をご覧ください。

このガイドでは、上記のダウンロードとエクスポートのアクションを行う手順について詳しく説明します。

BLOB ファイルのコンテンツをダウンロードする

ドライブに保存されている BLOB ファイルをダウンロードするには、ダウンロードするファイルの ID と alt=media URL パラメータを指定して files.get メソッドを使用します。alt=media URL パラメータは、代替レスポンス形式としてコンテンツのダウンロードがリクエストされていることをサーバーに伝えます。

alt=media URL パラメータは、すべての Google REST API で使用できるシステム パラメータです。Drive API のクライアント ライブラリを使用する場合は、このパラメータを明示的に設定する必要はありません。

次のコードサンプルは、Drive API クライアント ライブラリで files.get メソッドを使用してファイルをダウンロードする方法を示しています。

Java

drive/snippets/drive_v3/src/main/java/DownloadFile.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

/* Class to demonstrate use-case of drive's download file. */
public class DownloadFile {

  /**
   * Download a Document file in PDF format.
   *
   * @param realFileId file ID of any workspace document format file.
   * @return byte array stream if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static ByteArrayOutputStream downloadFile(String realFileId) throws IOException {
        /* Load pre-authorized user credentials from the environment.
           TODO(developer) - See https://developers.google.com/identity for
          guides on implementing OAuth2 for your application.*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    try {
      OutputStream outputStream = new ByteArrayOutputStream();

      service.files().get(realFileId)
          .executeMediaAndDownloadTo(outputStream);

      return (ByteArrayOutputStream) outputStream;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to move file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/download_file.py
import io

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaIoBaseDownload


def download_file(real_file_id):
  """Downloads a file
  Args:
      real_file_id: ID of the file to download
  Returns : IO object with location.

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_id = real_file_id

    # pylint: disable=maybe-no-member
    request = service.files().get_media(fileId=file_id)
    file = io.BytesIO()
    downloader = MediaIoBaseDownload(file, request)
    done = False
    while done is False:
      status, done = downloader.next_chunk()
      print(f"Download {int(status.progress() * 100)}.")

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.getvalue()


if __name__ == "__main__":
  download_file(real_file_id="1KuPmvGq8yoYgbfW74OENMCB5H0n_2Jm9")

Node.js

drive/snippets/drive_v3/file_snippets/download_file.js
/**
 * Downloads a file
 * @param{string} realFileId file ID
 * @return{obj} file status
 * */
async function downloadFile(realFileId) {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});

  fileId = realFileId;
  try {
    const file = await service.files.get({
      fileId: fileId,
      alt: 'media',
    });
    console.log(file.status);
    return file.status;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveDownloadFile.php
use Google\Client;
use Google\Service\Drive;
function downloadFile()
 {
    try {

      $client = new Client();
      $client->useApplicationDefaultCredentials();
      $client->addScope(Drive::DRIVE);
      $driveService = new Drive($client);
      $realFileId = readline("Enter File Id: ");
      $fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
      $fileId = $realFileId;
      $response = $driveService->files->get($fileId, array(
          'alt' => 'media'));
      $content = $response->getBody()->getContents();
      return $content;

    } catch(Exception $e) {
      echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/DownloadFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of drive's download file.
    public class DownloadFile
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">file ID of any workspace document format file.</param>
        /// <returns>byte array stream if successful, null otherwise.</returns>
        public static MemoryStream DriveDownloadFile(string fileId)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for 
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential
                    .GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var request = service.Files.Get(fileId);
                var stream = new MemoryStream();

                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);

                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

このコードサンプルでは、基盤となる HTTP リクエストに alt=media URL パラメータを追加するライブラリ メソッドを使用しています。

アプリから開始されたファイルのダウンロードは、ファイル コンテンツへの読み取りアクセスを許可するスコープで承認する必要があります。たとえば、drive.readonly.metadata スコープを使用するアプリは、ファイルの内容をダウンロードする権限がありません。このコードサンプルでは、ユーザーがすべてのドライブ ファイルを表示および管理できるようにする、制限付きの「ドライブ」ファイル スコープを使用しています。ドライブのスコープについて詳しくは、Google Drive API のスコープを選択するをご覧ください。

owner 権限(マイドライブ ファイルの場合)または organizer 権限(共有ドライブ ファイルの場合)を持つユーザーは、DownloadRestrictionsMetadata オブジェクトを使用してダウンロードを制限できます。詳しくは、ユーザーがファイルをダウンロード、印刷、コピーできないようにするをご覧ください。

不正使用(有害なソフトウェアなど)と判断されたファイルは、ファイルのオーナーのみがダウンロードできます。また、ユーザーが望ましくない可能性のあるソフトウェアやその他の不正なファイルをダウンロードするリスクを認識していることを示すために、get クエリ パラメータ acknowledgeAbuse=true を含める必要があります。アプリは、このクエリ パラメータを使用する前に、ユーザーに警告をインタラクティブに表示する必要があります。

部分的なダウンロード

部分的ダウンロードでは、ファイルの指定された部分のみをダウンロードします。ダウンロードするファイルの部分を指定するには、Range ヘッダーでバイト範囲を使用します。次に例を示します。

Range: bytes=500-999

以前のバージョンの BLOB ファイル コンテンツをダウンロードする

「この履歴を削除しない」と指定された blob ファイル コンテンツの改訂版のみをダウンロードできます。リビジョンをダウンロードする場合は、まず [この履歴を削除しない] に設定します。詳細については、自動削除から保存するリビジョンを指定するをご覧ください。

以前のバージョンの BLOB ファイルのコンテンツをダウンロードするには、ダウンロードするファイルの ID、リビジョンの ID、alt=media URL パラメータを指定して revisions.get メソッドを使用します。alt=media URL パラメータは、代替レスポンス形式としてコンテンツのダウンロードがリクエストされていることをサーバーに伝えます。files.get と同様に、revisions.get メソッドも省略可能なクエリ パラメータ acknowledgeAbuseRange ヘッダーを受け取ります。詳細については、長時間実行オペレーションを管理するをご覧ください。

リクエスト プロトコルがここに表示されます。

GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=media

ブラウザで BLOB ファイルのコンテンツをダウンロードする

API ではなくブラウザ内で Drive に保存されている blob ファイルのコンテンツをダウンロードするには、files リソースの webContentLink フィールドを使用します。ユーザーがファイルへのダウンロード アクセス権を持っている場合は、ファイルとそのコンテンツをダウンロードするためのリンクが返されます。この URL にユーザーをリダイレクトするか、クリック可能なリンクを提示します。

長時間実行オペレーション中に BLOB ファイルのコンテンツをダウンロードする

長時間実行オペレーション中に BLOB ファイルのコンテンツをダウンロードするには、ダウンロードするファイルの ID を指定して files.download メソッドを使用します。必要に応じて、リビジョンの ID を設定できます。Google Vids ファイルをダウンロードするには、この方法しかありません。詳細については、長時間実行オペレーションを管理するをご覧ください。

Google Workspace ドキュメントのコンテンツをエクスポートする

Google Workspace ドキュメントのバイト コンテンツをエクスポートするには、エクスポートするファイルの ID と正しい MIME タイプを指定して files.export メソッドを使用します。エクスポートされるコンテンツは 10 MB に制限されます。

次のコードサンプルは、Drive API クライアント ライブラリを使用して files.export メソッドで Google Workspace ドキュメントを PDF 形式でエクスポートする方法を示しています。

Java

drive/snippets/drive_v3/src/main/java/ExportPdf.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

/* Class to demonstrate use-case of drive's export pdf. */
public class ExportPdf {

  /**
   * Download a Document file in PDF format.
   *
   * @param realFileId file ID of any workspace document format file.
   * @return byte array stream if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException {
    // Load pre-authorized user credentials from the environment.
    // TODO(developer) - See https://developers.google.com/identity for
    // guides on implementing OAuth2 for your application.
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    OutputStream outputStream = new ByteArrayOutputStream();
    try {
      service.files().export(realFileId, "application/pdf")
          .executeMediaAndDownloadTo(outputStream);

      return (ByteArrayOutputStream) outputStream;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to export file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/export_pdf.py
import io

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaIoBaseDownload


def export_pdf(real_file_id):
  """Download a Document file in PDF format.
  Args:
      real_file_id : file ID of any workspace document format file
  Returns : IO object with location

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_id = real_file_id

    # pylint: disable=maybe-no-member
    request = service.files().export_media(
        fileId=file_id, mimeType="application/pdf"
    )
    file = io.BytesIO()
    downloader = MediaIoBaseDownload(file, request)
    done = False
    while done is False:
      status, done = downloader.next_chunk()
      print(f"Download {int(status.progress() * 100)}.")

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.getvalue()


if __name__ == "__main__":
  export_pdf(real_file_id="1zbp8wAyuImX91Jt9mI-CAX_1TqkBLDEDcr2WeXBbKUY")

Node.js

drive/snippets/drive_v3/file_snippets/export_pdf.js
/**
 * Download a Document file in PDF format
 * @param{string} fileId file ID
 * @return{obj} file status
 * */
async function exportPdf(fileId) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});

  try {
    const result = await service.files.export({
      fileId: fileId,
      mimeType: 'application/pdf',
    });
    console.log(result.status);
    return result;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveExportPdf.php
use Google\Client;
use Google\Service\Drive;
function exportPdf()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
        $fileId = $realFileId;
        $response = $driveService->files->export($fileId, 'application/pdf', array(
            'alt' => 'media'));
        $content = $response->getBody()->getContents();
        return $content;

    }  catch(Exception $e) {
         echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/ExportPdf.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive export pdf
    public class ExportPdf
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">Id of the file.</param>
        /// <returns>Byte array stream if successful, null otherwise</returns>
        public static MemoryStream DriveExportPdf(string fileId)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for 
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var request = service.Files.Export(fileId, "application/pdf");
                var stream = new MemoryStream();
                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);
                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

このコードサンプルでは、ユーザーがすべてのドライブ ファイルを表示および管理できる制限付きの drive スコープを使用しています。ドライブのスコープについて詳しくは、Google Drive API のスコープを選択するをご覧ください。

このコードサンプルでは、エクスポートの MIME タイプも application/pdf として宣言しています。各 Google Workspace ドキュメントでサポートされているすべてのエクスポート MIME タイプの完全なリストについては、Google Workspace ドキュメントのエクスポート MIME タイプをご覧ください。

ブラウザで Google Workspace ドキュメントのコンテンツをエクスポートする

ブラウザ内で Google Workspace ドキュメントのコンテンツをエクスポートするには、files リソースの exportLinks フィールドを使用します。ドキュメント タイプに応じて、利用可能なすべての MIME タイプについて、ファイルとそのコンテンツをダウンロードするためのリンクが返されます。この URL にユーザーをリダイレクトするか、クリック可能なリンクを提示します。

ブラウザで以前のバージョンの Google Workspace ドキュメントのコンテンツをエクスポートする

ブラウザ内で以前のバージョンの Google Workspace ドキュメントのコンテンツをエクスポートするには、ダウンロードするファイルの ID とリビジョンの ID を指定して revisions.get メソッドを使用し、ダウンロードを実行できるエクスポート リンクを生成します。ユーザーがファイルへのダウンロード アクセス権を持っている場合は、ファイルとそのコンテンツをダウンロードするためのリンクが返されます。この URL にユーザーをリダイレクトするか、クリック可能なリンクを提示します。

長時間実行オペレーション中に Google Workspace ドキュメントのコンテンツをエクスポートする

長時間実行オペレーション中に Google Workspace ドキュメントのコンテンツをエクスポートするには、ダウンロードするファイルの ID とリビジョンの ID を指定して files.download メソッドを使用します。詳細については、長時間実行オペレーションの管理をご覧ください。

ファイルの共有を制限する