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

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

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

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

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 スコープを使用するアプリには、ファイルの内容をダウンロードする権限がありません。このコードサンプルでは、制限付きの「drive」ファイル スコープを使用しています。これにより、ユーザーはすべてのドライブ ファイルを表示および管理できます。ドライブのスコープの詳細については、Google Drive API のスコープを選択するをご覧ください。

編集権限を持つユーザーは、copyRequiresWriterPermission フィールドを false に設定することで、読み取り専用ユーザーによるダウンロードを制限できます。

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

部分ダウンロード

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

Range: bytes=500-999

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

以前のバージョンの blob ファイルのコンテンツをダウンロードするには、revisions.get メソッドを使用して、ダウンロードするファイルの ID、リビジョンの ID、alt=media URL パラメータを使用します。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 ではなくブラウザ内でドライブに保存されている blob ファイルのコンテンツをダウンロードするには、files リソースの webContentLink フィールドを使用します。ユーザーがファイルのダウンロードにアクセスできる場合は、ファイルとそのコンテンツをダウンロードするためのリンクが返されます。この URL にユーザーをリダイレクトするか、クリック可能なリンクを提示します。

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

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

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

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

次のコードサンプルは、files.export メソッドを使用して、Drive API クライアント ライブラリを使用して 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 ドキュメント コンテンツをエクスポートするには、revisions.get メソッドを使用して、ダウンロードするファイルの ID とリビジョンの ID を指定して、ダウンロードを実行できるエクスポート リンクを生成します。ユーザーがファイルのダウンロードにアクセスできる場合は、ファイルとそのコンテンツをダウンロードするためのリンクが返されます。この URL にユーザーをリダイレクトするか、クリック可能なリンクを提示します。

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

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