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

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 ドキュメント コンテンツ。
以前のバージョンの Google Workspace ドキュメントのコンテンツを表示するには、ブラウザで exportLinks フィールドを使用します。
長時間実行オペレーション中に 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 スコープを使用するアプリには、ファイルの内容をダウンロードする権限がありません。このコードサンプルでは、制限付きの「ドライブ」ファイル スコープを使用して、ユーザーがすべてのドライブ ファイルを表示、管理できるようにします。ドライブのスコープの詳細については、Google Drive API のスコープを選択するをご覧ください。

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

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

部分ダウンロード

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

Range: bytes=500-999

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

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

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

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

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

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

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