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

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

次の 3 種類のアップロードを行うことができます。

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

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

  • 再開可能アップロード(uploadType=resumable - 大きなファイル(5 MB 超)や、ネットワークの中断が発生する可能性が高い状況(モバイルアプリからファイルを作成する場合など)にこのアップロード タイプを使用します。再開可能なアップロードは小規模なファイルでも最小限のアップロード費用でしか利用できないため、ほとんどのアプリに適しています。再開可能なアップロードを実行するには、再開可能なアップロードを実行するをご覧ください。

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

PATCH ではなく PUT を使用する

復習として、HTTP 動詞 PATCH は部分的なリソース アップデートをサポートしていますが、HTTP 動詞 PUT は完全なリソース置換をサポートしています。既存のリソースに新しいフィールドを追加すると、PUT によって互換性を破る変更が発生する可能性があります。

ファイル リソースをアップロードする際は、次のガイドラインを参考にしてください。

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

シンプル アップロードの実行

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

シンプル アップロードの実行方法は次のとおりです。

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 などの属性がファイルから推定されます。ファイルが小さく、ファイルのメタデータが重要でない場合は、単純なアップロードを使用できます。

マルチパート アップロードの実行

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

マルチパート アップロードを実行するには、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
from __future__ import print_function

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

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

    各パーツはバウンダリ文字列で始まり、その前に 2 つのハイフンが続きます。また、最後の境界文字列の後に 2 つのハイフンを追加します。

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

    • Content-Typemultipart/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=resumablefiles.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 つのリクエストに時間制限がない場合、またはアップロード進行状況インジケーターを表示する必要がない場合にこの方法を使用します。この方法は、リクエストが少なく、パフォーマンスが向上するため、最適です。
  • 複数のチャンクでコンテンツをアップロードする - 単一のリクエストで転送されるデータ量を削減する必要がある場合は、この方法を使用します。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 は、最初の 524, 288 バイト(256 x 1,024 x 2)を 2,000,000 バイトのファイルでアップロードしていることを示します。
  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
from __future__ import print_function

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 配列を確認してください。サポートされている変換は、この配列で動的に利用可能です。一般的なインポート形式は次のとおりです。

FromTo
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)を使用して画像がテキストに変換されます。OCR アルゴリズムの品質を改善するには、ocrLanguage パラメータで該当する BCP 47 言語コードを指定します。抽出されたテキストは、ドキュメント内に埋め込み画像とともに表示されます。

生成済み ID を使ってファイルをアップロード

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

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

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

不明なファイル形式のインデックス可能なテキストを定義する

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

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

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