ファイル データをアップロードする

Google Drive API を使用すると、File を作成または更新するときにファイルデータをアップロードできます。メタデータのみの File を作成する方法については、ファイルを作成するをご覧ください。

次の 3 種類のアップロードを実行できます。

  • シンプル アップロード(uploadType=media - このアップロード タイプを使用すると、メタデータを指定せずにサイズの小さいメディア ファイル(5 MB 以下)を転送できます。シンプル アップロードを実行するには、シンプル アップロードを実行するをご覧ください。

  • マルチパート アップロード(uploadType=multipart - このアップロード タイプを使用すると、小さなファイル(5 MB 以下)とファイルを記述するメタデータを 1 つのリクエストで転送します。マルチパート アップロードを実行するには、マルチパート アップロードを実行するをご覧ください。

  • 再開可能アップロード(uploadType=resumable - サイズの大きいファイル(5 MB を超える)や、モバイルアプリからファイルを作成する場合など、ネットワークが中断される可能性が高い場合に使用します。再開可能なアップロードは、小さなファイルでも機能するため、アップロードごとに HTTP リクエストを 1 つ追加するという最低限の費用で機能するため、ほとんどのアプリケーションに適しています。再開可能なアップロードを実行するには、再開可能なアップロードを実行するをご覧ください。

Google API クライアント ライブラリは、これらのタイプのアップロードのうち少なくとも 1 つを実装しています。各タイプの使用方法の詳細については、クライアント ライブラリのドキュメントをご覧ください。

PUT」ではなく「PATCH」を使用

おさらいすると、HTTP 動詞 PATCH はファイル リソースの部分更新をサポートするのに対し、HTTP 動詞 PUT はリソースの完全な置換をサポートします。PUT では、既存のリソースに新しいフィールドを追加するときに、互換性を破る変更が行われる場合があります。

ファイル リソースをアップロードする場合は、次のガイドラインに従ってください。

  • 再開可能なアップロードの最初のリクエスト、またはシンプルなアップロードまたはマルチパート アップロードの最初のリクエストには、API リファレンスに記載されている HTTP 動詞を使用します。
  • リクエストが開始されたら、再開可能アップロードの後続のすべてのリクエストで PUT を使用します。これらのリクエストでは、呼び出されているメソッドに関係なく、コンテンツをアップロードします。

シンプル アップロードを実行する

単純なアップロードを実行するには、uploadType=mediafiles.create メソッドを使用します。

シンプル アップロードの実行方法を以下に示します。

HTTP

  1. クエリ パラメータ uploadType=media を指定して、このメソッドの /upload URI に対する POST リクエストを作成します。

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media

  2. ファイルのデータをリクエストの本文に追加します。

  3. 次の HTTP ヘッダーを追加します。

    • Content-Type: アップロードするオブジェクトの MIME メディアタイプに設定します。
    • Content-Length: アップロードするバイト数に設定します。チャンク転送エンコードを使用する場合、このヘッダーは必要ありません。
  4. リクエストを送信します。リクエストが成功すると、サーバーは HTTP 200 OK ステータス コードとファイルのメタデータを返します。{HTTP}

シンプル アップロードを実行すると、基本的なメタデータが作成され、MIME タイプや modifiedTime などの属性がファイルから推定されます。小さなファイルがあり、ファイル メタデータが重要でない場合は、シンプル アップロードを使用できます。

マルチパート アップロードを実行する

マルチパート アップロード リクエストを使用すると、1 つのリクエストでメタデータとデータをアップロードできます。送信するデータが小さく、接続が失敗した場合にファイル全体を再アップロードできる場合は、このオプションを使用します。

マルチパート アップロードを実行するには、uploadType=multipartfiles.create メソッドを使用します。

マルチパート アップロードの実行方法を以下に示します。

Java

drive/snippets/drive_v3/src/main/java/UploadBasic.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
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.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use of Drive insert file API */
public class UploadBasic {

  /**
   * Upload new file.
   *
   * @return Inserted file metadata if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadBasic() 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();
    // Upload file photo.jpg on drive.
    File fileMetadata = new File();
    fileMetadata.setName("photo.jpg");
    // File's content.
    java.io.File filePath = new java.io.File("files/photo.jpg");
    // Specify media type and file-path for file.
    FileContent mediaContent = new FileContent("image/jpeg", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to upload file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/upload_basic.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_basic():
  """Insert new file.
  Returns : Id's of the file uploaded

  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_metadata = {"name": "download.jpeg"}
    media = MediaFileUpload("download.jpeg", mimetype="image/jpeg")
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File ID: {file.get("id")}')

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

  return file.get("id")


if __name__ == "__main__":
  upload_basic()

Node.js

drive/snippets/drive_v3/file_snippets/upload_basic.js
/**
 * Insert new file.
 * @return{obj} file Id
 * */
async function uploadBasic() {
  const fs = require('fs');
  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});
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  try {
    const file = await service.files.create({
      requestBody,
      media: media,
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadBasic.php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function uploadBasic()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
        'name' => 'photo.jpg'));
        $content = file_get_contents('../files/photo.jpg');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'image/jpeg',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    } 

}

.NET

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

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive insert file API
    public class UploadBasic
    {
        /// <summary>
        /// Upload new file.
        /// </summary>
        /// <param name="filePath">Image path to upload.</param>
        /// <returns>Inserted file metadata if successful, null otherwise.</returns>
        public static string DriveUploadBasic(string filePath)
        {
            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"
                });

                // Upload file photo.jpg on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "photo.jpg"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new file on drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "image/jpeg");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

HTTP

  1. クエリ パラメータ uploadType=multipart を指定して、このメソッドの /upload URI に対する POST リクエストを作成します。

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart

  2. リクエストの本文を作成します。次の 2 つのパートを含むマルチパート/関連コンテンツ タイプ [RFC 2387] に従って本文をフォーマットします。

    • メタデータ。メタデータを最初に配置し、Content-Type ヘッダーを application/json; charset=UTF-8 に設定する必要があります。ファイルのメタデータを JSON 形式で追加します。
    • メディア。メディアを 2 番目に配置し、任意の MIME タイプの Content-Type ヘッダーを含める必要があります。ファイルのデータをメディア部分に追加します。

    2 つのハイフンの後に続く境界文字列で各部分を識別します。さらに、最後の境界文字列の後に 2 つのハイフンを追加します。

  3. 次のトップレベルの HTTP ヘッダーを追加します。

    • Content-Type: multipart/related に設定し、リクエストのさまざまな部分を識別するために使用する境界文字列を含めます。例: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length: リクエスト本文の総バイト数に設定します。
  4. リクエストを送信します。

関連データなしでメタデータ部分のみを作成または更新するには、POST リクエストまたは PATCH リクエストを標準のリソース エンドポイント https://www.googleapis.com/drive/v3/files に送信します。リクエストが成功すると、サーバーはファイルのメタデータとともに HTTP 200 OK ステータス コードを返します。

ファイルを作成するときに、ファイルの name フィールドにファイル拡張子を指定する必要があります。たとえば、写真 JPEG ファイルを作成するときに、メタデータで "name": "photo.jpg" などを指定できます。その後の files.get の呼び出しでは、name フィールドに元々指定されていた拡張機能を含む読み取り専用の fileExtension プロパティが返されます。

再開可能アップロードの実行

再開可能なアップロードを使用すると、通信障害でデータのフローが中断しても、アップロード操作を再開できます。大規模なファイルのアップロードを最初からやり直す必要がないため、再開可能なアップロードを使用すると、ネットワーク障害が発生した場合に帯域幅の使用量を削減することもできます。

再開可能なアップロードは、ファイルサイズが大幅に変動する可能性がある場合や、リクエスト(モバイル OS のバックグラウンド タスクや特定の App Engine リクエストなど)に一定の時間制限がある場合に役立ちます。アップロードの進行状況バーを表示する場合は、再開可能なアップロードを使用することもできます。

再開可能なアップロードの大まかな流れは次のとおりです。

  1. 最初のリクエストを送信して再開可能セッション URI を取得します。
  2. データをアップロードし、アップロード状態をモニタリングする。
  3. (省略可)アップロードが中断された場合は、アップロードを再開します。

最初のリクエストを送信する

再開可能なアップロードを開始するには、uploadType=resumable を指定して files.create メソッドを使用します。

HTTP

  1. クエリ パラメータ uploadType=resumable を指定して、このメソッドの /upload URI に対する POST リクエストを作成します。

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable

    開始リクエストが成功すると、レスポンスには 200 OK HTTP ステータス コードが含まれます。さらに、再開可能セッション URI を指定する Location ヘッダーを含めます。

    HTTP/1.1 200 OK
    Location: https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=xa298sd_sdlkj2
    Content-Length: 0
    

    ファイルデータをアップロードし、アップロード ステータスをクエリできるように、再開可能セッション URI を保存します。再開可能なセッション URI は、1 週間後に期限切れになります。

  2. ファイルのメタデータがある場合は、JSON 形式でリクエスト本文にメタデータを追加します。それ以外の場合には、リクエストの本文は空にしておきます。

  3. 次の HTTP ヘッダーを追加します。

    • X-Upload-Content-Type。省略できます。ファイルデータの MIME タイプに設定します。これは、後続のリクエストで転送されます。データの MIME タイプがメタデータまたはこのヘッダーで指定されていない場合、オブジェクトは application/octet-stream. として扱われます。
    • X-Upload-Content-Length。省略できます。後続のリクエストで転送されるファイルデータのバイト数に設定します。
    • Content-Type。ファイルにメタデータがある場合には必須です。application/json; charset=UTF-8 に設定します。
    • Content-Length。チャンク形式の転送エンコードを使用する場合を除き、必須。この最初のリクエストの本文のバイト数に設定します。
  4. リクエストを送信します。セッション開始リクエストが成功すると、レスポンスには 200 OK HTTP ステータス コードが含まれます。また、レスポンスには、再開可能なセッション URI を指定する Location ヘッダーが含まれます。再開可能セッション URI を使用してファイルデータをアップロードし、アップロード ステータスをクエリします。再開可能なセッション URI は、1 週間後に期限切れになります。

  5. 再開可能セッションの URL をコピーして保存します。

  6. コンテンツをアップロードするに進みます。

コンテンツをアップロードする

再開可能セッションでファイルをアップロードするには、次の 2 つの方法があります。

  • 1 つのリクエストでコンテンツをアップロードする - 1 つのリクエストでファイルをアップロードできる場合、1 つのリクエストに一定の時間制限がない場合、またはアップロード進行状況インジケーターを表示する必要がない場合は、この方法を使用します。この方法は、必要なリクエストが少なくて済み、パフォーマンスが向上するため、最適です。
  • 複数のチャンクでコンテンツをアップロードする - 1 つのリクエストで転送するデータの量を減らす必要がある場合は、この方法を使用します。App Engine リクエストの特定のクラスのように、リクエストごとに固定の時間制限がある場合は、転送されるデータの削減が必要になる場合があります。この方法は、アップロードの進行状況を示すカスタマイズされたインジケーターを用意する必要がある場合にも役立ちます。

HTTP - 単一リクエスト

  1. 再開可能なセッションの URI に PUT リクエストを作成します。
  2. ファイルのデータをリクエストの本文に追加します。
  3. Content-Length HTTP ヘッダーを追加し、ファイルのバイト数に設定します。
  4. リクエストを送信します。アップロード リクエストが中断された場合、または 5xx レスポンスが返された場合は、中断されたアップロードを再開するの手順に沿って操作します。

HTTP - 複数のリクエスト

  1. 再開可能なセッションの URI に PUT リクエストを作成します。

  2. リクエストの本文にチャンクのデータを追加します。サイズが 256 KB(256 x 1,024 バイト)の倍数になるようにチャンクを作成します(アップロードを完了する最後のチャックは除く)。アップロードを効率的に行うため、チャンクサイズはできるだけ大きくしてください。

  3. 次の HTTP ヘッダーを追加します。

    • Content-Length。現在のチャンクのバイト数を設定します。
    • Content-Range: ファイルの何バイト目から何バイト目までをアップロードするかを設定します。たとえば、Content-Range: bytes 0-524287/2000000 は、2, 000,000 バイトのファイルをアップロードし、最初の 524,288 バイト(256 x 1,024 x 2)をアップロードすることを意味します。
  4. リクエストを送信してレスポンスを処理します。アップロード リクエストが中断した場合、または 5xx レスポンスが返された場合は、中断されたアップロードを再開するの手順を行ってください。

  5. ファイルに残っているチャンクごとに手順 1 ~ 4 を繰り返します。レスポンスの Range ヘッダーを使用して、次のチャンクの開始位置を決定します。前のリクエストで送信したバイトがすべてサーバーで受信されたとは限りません。

ファイル全体のアップロードが完了すると、リソースに関連するメタデータとともに 200 OK または 201 Created レスポンスが返されます。

中断されたアップロードを再開する

レスポンスの前にアップロード リクエストが終了した場合、または 503 Service Unavailable レスポンスが返された場合は、中断されたアップロードを再開する必要があります。

HTTP

  1. アップロードのステータスを取得するため、再開可能なセッションの URI に空の PUT リクエストを作成します。

  2. ファイルの現在の位置が不明であることを示す Content-Range ヘッダーを追加します。たとえば、ファイルの合計長が 2,000,000 バイトの場合は、Content-Range*/2000000 に設定します。ファイル全体のサイズがわからない場合は、Content-Range*/* に設定します。

  3. リクエストを送信します。

  4. レスポンスを処理します。

    • 200 OK または 201 Created が返された場合、アップロードは完了しています。これ以上の操作は必要ありません。
    • 308 Resume Incomplete が返された場合、ファイルのアップロードを続行する必要があります。
    • 404 Not Found レスポンスは、アップロード セッションの有効期限が切れたため、アップロードを最初からやり直す必要があることを示します。
  5. 308 Resume Incomplete レスポンスを受け取った場合は、レスポンスの Range ヘッダーを処理して、サーバーが受信したバイト数を確認します。レスポンスに Range ヘッダーがない場合、バイトは受信されていません。たとえば、Range ヘッダーが bytes=0-42 の場合、ファイルの最初の 43 バイトが受信され、次にアップロードするチャンクが 44 バイトで始まることを示します。

  6. アップロードを再開する場所がわかったので、ファイルのアップロードを次のバイトから開始します。Content-Range ヘッダーを追加して、ファイルのどの部分を送信するかを示します。たとえば、Content-Range: bytes 43-1999999 は 44 から 2,000,000 のバイトを送信することを示します。

メディア アップロード エラーを処理する

メディアをアップロードする際は、以下のおすすめの方法に沿ってエラーに対処してください。

  • 5xx エラーが発生した場合は、接続の中断により失敗したアップロードを再開または再試行します。5xx エラーの処理について詳しくは、5xx エラーを解決するをご覧ください。
  • 403 rate limit エラーが発生した場合は、アップロードを再試行してください。403 rate limit エラーの処理について詳しくは、403 error: Rate limit exceeded を解決するをご覧ください。
  • 再開可能なアップロードで 4xx エラーが発生した場合(403 を含む)は、アップロードを再開します。これらのエラーは、アップロード セッションの有効期限が切れており、新しいセッション URI をリクエストして再開する必要があることを示します。アップロード セッションも、1 週間操作を行わないと期限切れになります。

Google ドキュメントの種類へのインポート

ドライブでファイルを作成するときに、Google ドキュメントや Google スプレッドシートなどの Google Workspace ファイル形式にファイルを変換する必要がある場合があります。たとえば、お気に入りのワード プロセッサのドキュメントを Google ドキュメントに変換し、その機能を活用したい場合などです。

ファイルを特定の Google Workspace ファイル形式に変換するには、ファイルの作成時に Google Workspace の mimeType を指定します。

次に、CSV ファイルを Google Workspace シートに変換する方法を示します。

Java

drive/snippets/drive_v3/src/main/java/UploadWithConversion.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
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.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate Drive's upload with conversion use-case. */
public class UploadWithConversion {

  /**
   * Upload file with conversion.
   *
   * @return Inserted file id if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadWithConversion() 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();

    // File's metadata.
    File fileMetadata = new File();
    fileMetadata.setName("My Report");
    fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

    java.io.File filePath = new java.io.File("files/report.csv");
    FileContent mediaContent = new FileContent("text/csv", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } 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/upload_with_conversion.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_with_conversion():
  """Upload file with conversion
  Returns: ID of the file uploaded

  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_metadata = {
        "name": "My Report",
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    media = MediaFileUpload("report.csv", mimetype="text/csv", resumable=True)
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File with ID: "{file.get("id")}" has been uploaded.')

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

  return file.get("id")


if __name__ == "__main__":
  upload_with_conversion()

Node.js

drive/snippets/drive_v3/file_snippets/upload_with_conversion.js
/**
 * Upload file with conversion
 * @return{obj} file Id
 * */
async function uploadWithConversion() {
  const fs = require('fs');
  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});
  const fileMetadata = {
    name: 'My Report',
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  try {
    const file = await service.files.create({
      resource: fileMetadata,
      media: media,
      fields: 'id',
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadWithConversion.php
use Google\Client;
use Google\Service\Drive;
function uploadWithConversion()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
            'name' => 'My Report',
            'mimeType' => 'application/vnd.google-apps.spreadsheet'));
        $content = file_get_contents('../files/report.csv');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'text/csv',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

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

namespace DriveV3Snippets
{
    // Class to demonstrate Drive's upload with conversion use-case.
    public class UploadWithConversion
    {
        /// <summary>
        /// Upload file with conversion.
        /// </summary>
        /// <param name="filePath">Id of the spreadsheet file.</param>
        /// <returns>Inserted file id if successful, null otherwise.</returns>
        public static string DriveUploadWithConversion(string filePath)
        {
            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"
                });

                // Upload file My Report on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "My Report",
                    MimeType = "application/vnd.google-apps.spreadsheet"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "text/csv");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

コンバージョンが使用可能かどうかを確認するには、ファイルを作成する前に、About リソースの importFormats 配列を確認します。サポートされているコンバージョンは、この配列で動的に提供されます。一般的なインポート形式は次のとおりです。

送信者To
Microsoft Word、OpenDocument テキスト、HTML、RTF、書式なしテキストGoogle ドキュメント
Microsoft Excel、OpenDocument スプレッドシート、CSV、TSV、書式なしテキストGoogle スプレッドシート
Microsoft PowerPoint、OpenDocument プレゼンテーションGoogle Slides
JPEG、PNG、GIF、BMP、PDFGoogle ドキュメント(ドキュメントに画像を埋め込み)
書式なしテキスト(特別な MIME タイプ)、JSONGoogle Apps Script

update リクエストの実行中にメディアをドキュメント、スプレッドシート、スライドにアップロードして変換すると、ドキュメントの内容全体が置き換えられます。

画像をドキュメントに変換すると、ドライブでは光学式文字認識(OCR)を使用して画像がテキストに変換されます。ocrLanguage パラメータに該当する BCP 47 言語コードを指定すると、OCR アルゴリズムの品質を向上させることができます。抽出されたテキストは、ドキュメントに埋め込み画像とともに表示されます。

事前に生成された ID を使用してファイルをアップロードする

Drive API を使用すると、事前に生成されたファイル ID のリストを取得して、リソースのアップロードと作成に使用できます。アップロードとファイル作成のリクエストでは、これらの事前生成された ID を使用できます。ファイル メタデータで id フィールドを設定します。

事前に生成された ID を作成するには、作成する ID の数を指定して file.generateIds を呼び出します。

不明なサーバーエラーやタイムアウトが発生した場合、事前に生成された ID を使用してアップロードを再試行できます。ファイルが正常に作成された場合、その後の再試行では HTTP 409 エラーが返され、ファイルの重複は発生しません。

不明なファイル形式に対してインデックス登録可能なテキストを定義する

ユーザーはドライブの UI を使用してドキュメント コンテンツを検索できます。files.listfullText フィールドを使用してアプリのコンテンツを検索することもできます。詳しくは、ファイルやフォルダを検索するをご覧ください。

ドライブは、テキスト ドキュメント、PDF、テキストを含む画像、その他の一般的なタイプなどのファイル形式を認識すると、検索用にドキュメントを自動的にインデックスに登録します。アプリで他の種類のファイル(図形描画、動画、ショートカットなど)を保存する場合は、ファイルの contentHints.indexableText フィールドにインデックス登録可能なテキストを指定することで、見つけやすさを改善できます。

インデックス登録可能なテキストの詳細については、ファイル メタデータを管理するをご覧ください。