Google Drive API を使用すると、File
の作成時または更新時にファイルデータをアップロードできます。フォルダなどのメタデータのみのファイルの作成方法については、メタデータのみのファイルを作成するをご覧ください。
アップロードには次の 3 種類があります。
シンプル アップロード(
uploadType=media
): このアップロード タイプは、メタデータを指定せずに小さなメディア ファイル(5 MB 以下)を転送する場合に使用します。単純なアップロードを実行するには、単純なアップロードを実行するをご覧ください。マルチパート アップロード(
uploadType=multipart
): 「このアップロード タイプを使用して、ファイルの説明を含むメタデータとともに、小さなファイル(5 MB 以下)を 1 回のリクエストで転送します。マルチパート アップロードを実行するには、マルチパート アップロードを実行するをご覧ください。再開可能なアップロード(
uploadType=resumable
): このアップロード タイプは、5 MB を超える大きなファイルや、モバイルアプリからファイルを作成する場合など、ネットワークが中断される可能性が高い場合に使用します。再開可能なアップロードは、アップロードごとに 1 つの HTTP リクエストを送信するだけで、サイズの小さなファイルでも利用できるため、ほとんどのアプリケーションに適しています。再開可能なアップロードを行うには、再開可能なアップロードを行うをご覧ください。
Google API クライアント ライブラリは、これらのアップロードの少なくとも 1 つを実装します。各タイプの使用方法について詳しくは、クライアント ライブラリのドキュメントをご覧ください。
PATCH
と PUT
の使用状況
HTTP 動詞 PATCH
はファイル リソースの部分的な更新をサポートし、HTTP 動詞 PUT
はリソースの完全な置換をサポートします。PUT
は、既存のリソースに新しいフィールドを追加するときに、互換性を損なう変更を導入する可能性があります。
ファイル リソースをアップロードする場合は、次のガイドラインを使用します。
- 再開可能なアップロードの最初のリクエスト、または単純なアップロードまたはマルチパート アップロードの唯一のリクエストには、API リファレンスに記載されている HTTP 動詞を使用します。
- リクエストが開始されたら、再開可能なアップロードの後続のすべてのリクエストに
PUT
を使用します。これらのリクエストは、呼び出されるメソッドに関係なくコンテンツをアップロードします。
シンプルなアップロードを実行する
シンプルなアップロードを実行するには、uploadType=media
で files.create
メソッドを使用します。
次の例は、単純なアップロードを実行する方法を示しています。
HTTP
uploadType=media
のクエリ パラメータを使用して、メソッドの /upload URI に対するPOST
リクエストを作成します。POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media
ファイルのデータをリクエストの本文に追加します。
次の HTTP ヘッダーを追加します。
Content-Type
: アップロードするオブジェクトの MIME メディアタイプに設定します。Content-Length
: アップロードするバイト数に設定します。チャンク形式転送エンコードを使用する場合、このヘッダーは不要です。
リクエストを送信します。 リクエストが成功すると、サーバーは
HTTP 200 OK
ステータス コードとファイルのメタデータを返します。{HTTP}
シンプルなアップロードを実行すると、基本的なメタデータが作成され、MIME タイプや modifiedTime
など、ファイルから一部の属性が推測されます。ファイルが小さく、ファイル メタデータが重要でない場合は、シンプルなアップロードを使用できます。
マルチパート アップロードを実行する
マルチパート アップロード リクエストを使用すると、同じリクエストでメタデータとデータをアップロードできます。送信するデータが小さく、接続が失敗したときにデータ全体を再度アップロードできる場合は、このオプションを使用します。
マルチパート アップロードを実行するには、uploadType=multipart
で files.create
メソッドを使用します。
マルチパート アップロードを実行する方法は次のとおりです。
Java
Python
Node.js
PHP
.NET
HTTP
uploadType=multipart
のクエリ パラメータを使用して、メソッドの /upload URI に対するPOST
リクエストを作成します。POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart
リクエストの本文を作成します。本文の形式は multipart/related コンテンツ タイプ RFC 2387 に従います。本文には次の 2 つの部分が含まれます。
- メタデータ。メタデータは最初に配置し、
Content-Type
ヘッダーをapplication/json;
charset=UTF-8
に設定する必要があります。ファイルのメタデータを JSON 形式で追加します。 - メディア。メディアは 2 番目に配置し、任意の MIME タイプの
Content-Type
ヘッダーを指定する必要があります。ファイルのデータをメディア パーツに追加します。
最初の境界文字列の前に 2 個のハイフンを付けて、各部分を区別します。さらに、最後の境界文字列の後に 2 個のハイフンを追加します。
- メタデータ。メタデータは最初に配置し、
次のトップレベルの HTTP ヘッダーを追加します。
Content-Type
。multipart/related
に設定し、リクエストの各部分の識別に使用する境界文字列を含めます。例:Content-Type: multipart/related; boundary=foo_bar_baz
Content-Length
: リクエスト本文の総バイト数に設定します。
リクエストを送信します。
関連付けられたデータなしでメタデータ部分のみを作成または更新するには、POST
リクエストまたは PATCH
リクエストを標準リソース エンドポイント(https://www.googleapis.com/drive/v3/files
)に送信します。リクエストが成功すると、サーバーは HTTP 200 OK
ステータス コードとファイルのメタデータを返します。
ファイルを作成するときは、ファイルの name
フィールドでファイル拡張子を指定する必要があります。たとえば、写真の JPEG ファイルを作成するときに、メタデータで "name": "photo.jpg"
などを指定できます。files.get
の後続の呼び出しは、name
フィールドで最初に指定された拡張機能を含む読み取り専用の fileExtension
プロパティを返します。
再開可能なアップロードを実行する
再開可能なアップロードを使用すると、通信障害によってデータのフローが中断しても、アップロード オペレーションを再開できます。再開可能なアップロードでは、ネットワーク障害が発生した場合に大容量のファイルのアップロードを最初からやり直す必要がないため、使用する帯域幅を削減できます。
再開可能アップロードは、ファイルサイズが大きく異なる可能性がある場合や、リクエストに固定の時間制限がある場合(モバイル OS のバックグラウンド タスクや特定の App Engine リクエストなど)に便利です。アップロードの進行状況バーを表示したい場合にも、再開可能なアップロードを使用できます。
再開可能なアップロードは、次のような複数の手順で構成されます。
- 最初のリクエストを送信し、再開可能セッション URI を取得します。
- データをアップロードし、アップロード状態をモニタリングします。
- (省略可)アップロードが中断された場合は、アップロードを再開します。
最初のリクエストを送信する
再開可能なアップロードを開始するには、uploadType=resumable
で files.create
メソッドを使用します。
HTTP
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 週間後に期限切れになります。
ファイルにメタデータがある場合は、リクエストの本文に JSON 形式でメタデータを追加します。それ以外の場合には、リクエストの本文は空にしておきます。
次の HTTP ヘッダーを追加します。
X-Upload-Content-Type
。省略できます。ファイルデータの MIME タイプに設定します。これは、後続のリクエストで転送されます。メタデータで、またはこのヘッダーを介してデータの MIME タイプが指定されていない場合、オブジェクトはapplication/octet-stream.
として提供されます。X-Upload-Content-Length
。省略できます。後続のリクエストで転送されるファイルデータのバイト数を設定します。Content-Type
。ファイルにメタデータがある場合には必須です。application/json;
charset=UTF-8
に設定します。Content-Length
。チャンク転送エンコードを使用しない場合は必須です。この開始リクエスト本文のバイト数を設定します。
リクエストを送信します。 セッション開始リクエストが成功すると、
200 OK HTTP
ステータス コードが返されます。また、再開可能なセッション URI を指定したLocation
ヘッダーも含まれます。再開可能なセッション URI を使用してファイルデータをアップロードし、アップロード ステータスを確認します。再開可能なセッションの URI は 1 週間後に期限切れになります。再開可能なセッションの URL をコピーして保存します。
コンテンツのアップロードに進みます。
コンテンツをアップロードする
再開可能なセッションでファイルをアップロードするには、2 つの方法があります。
- 1 つのリクエストでコンテンツをアップロードする: 1 つのリクエストでファイルをアップロードできる場合、1 つのリクエストに固定された時間制限がない場合、またはアップロードの進行状況インジケーターを表示する必要がない場合は、この方法を使用します。この方法は、リクエストの数が少なく、パフォーマンスが向上するため、最適です。
コンテンツを複数のチャンクでアップロードする: 1 つのリクエストで転送されるデータ量を削減する必要がある場合は、この方法を使用します。App Engine リクエストの一部のクラスのように、リクエストごとに固定の時間制限がある場合は、転送されるデータを減らす必要があることがあります。このアプローチは、アップロードの進行状況を示すカスタム インジケーターを提供する必要がある場合にも役立ちます。
HTTP - 単一リクエスト
- 再開可能なセッションの URI に
PUT
リクエストを作成します。 - ファイルのデータをリクエストの本文に追加します。
- Content-Length HTTP ヘッダーを追加し、ファイルのバイト数に設定します。
- リクエストを送信します。 アップロード リクエストが中断された場合、または
5xx
レスポンスを受け取った場合は、中断されたアップロードを再開するの手順に沿って対応してください。
HTTP - 複数のリクエスト
再開可能なセッションの URI に
PUT
リクエストを作成します。リクエストの本文にチャンクのデータを追加します。サイズが 256 KB(256 x 1,024 バイト)の倍数になるようにチャンクを作成します(アップロードを完了する最後のチャックは除く)。アップロードを効率的に行うため、チャンクサイズはできるだけ大きくしてください。
次の HTTP ヘッダーを追加します。
Content-Length
。現在のチャンクのバイト数を設定します。Content-Range
: ファイルの何バイト目から何バイト目までをアップロードするかを設定します。たとえば、Content-Range: bytes 0-524287/2000000
は、2, 000,000 バイトのファイルで先頭の 524,288 バイト(256 x 1,024 x 2)をアップロードすることを意味します。
リクエストを送信してレスポンスを処理します。アップロード リクエストが中断された場合、または
5xx
レスポンスを受け取った場合は、中断されたアップロードを再開するの手順に沿って対応してください。ファイルに残っているチャンクごとに手順 1 ~ 4 を繰り返します。レスポンスの
Range
ヘッダーを使用して、次のチャンクの開始位置を決定します。前のリクエストで送信したデータがすべてサーバーで受信されているとは限りません。
ファイル全体のアップロードが完了すると、200 OK
または 201 Created
レスポンスと、リソースに関連付けられたメタデータを受け取ります。
中断されたアップロードを再開する
レスポンスを受信する前にアップロード リクエストが終了した場合や、503
Service Unavailable
レスポンスを受け取った場合は、中断されたアップロードを再開する必要があります。
HTTP
アップロードのステータスを取得するため、再開可能なセッションの URI に空の
PUT
リクエストを作成します。ファイル内の現在の位置が不明であることを示す
Content-Range
ヘッダーを追加します。たとえば、ファイルの合計サイズが 2,000,000 バイトの場合は、Content-Range
を*/2000000
に設定します。ファイル全体のサイズがわからない場合は、Content-Range
を*/*
に設定します。リクエストを送信します。
レスポンスを処理します。
200 OK
または201 Created
が返された場合、アップロードは完了しています。これ以上の操作は必要ありません。308 Resume Incomplete
が返された場合、ファイルのアップロードを続行する必要があります。404 Not Found
レスポンスは、アップロード セッションが期限切れになったため、アップロードを最初からやり直す必要があることを示します。
308 Resume Incomplete
レスポンスを受信した場合は、レスポンスのRange
ヘッダーを処理して、サーバーが受信したバイト数を特定します。レスポンスにRange
ヘッダーがない場合、バイトは受信されていません。たとえば、Range
ヘッダーがbytes=0-42
の場合、ファイルの先頭から 43 バイトを受信したこと、次にアップロードするチャンクが 44 バイトから始まることを示します。これで、アップロードを再開する場所が確認できました。次のバイトからファイルのアップロードを続行します。送信するファイルの部分を示す
Content-Range
ヘッダーを含めます。たとえば、Content-Range: bytes 43-1999999
は、44 バイト目から 2,000,000 バイト目までを送信することを示します。
メディア アップロード時のエラーへの対処
メディアをアップロードする際は、次のベスト プラクティスに沿ってエラーを処理してください。
5xx
エラーの場合は、接続の中断が原因で失敗したアップロードを再開または再試行します。5xx
エラーの処理について詳しくは、500、502、503、504 エラーを参照してください。403 rate limit
エラーの場合は、アップロードを再試行します。403 rate limit
エラーの処理について詳しくは、403 エラー:rateLimitExceeded
をご覧ください。- 再開可能なアップロード中に
4xx
エラー(403
を含む)が発生した場合は、アップロードを再開します。これらのエラーは、アップロード セッションが期限切れになったことを示します。新しいセッション URI をリクエストして、アップロード セッションを再開する必要があります。アップロード セッションも、非アクティブ状態が 1 週間続くと期限切れになります。
Google ドキュメントにインポートできるファイル形式
ドライブでファイルを作成する際に、Google ドキュメントや Google スプレッドシートなどの Google Workspace ファイル形式に変換することがあります。たとえば、お気に入りのワープロで作成したドキュメントをドキュメントに変換して、その機能を利用したい場合などです。
ファイルを特定の Google Workspace ファイル形式に変換するには、ファイルを作成するときに Google Workspace の mimeType
を指定します。
CSV ファイルを Google Workspace スプレッドシートに変換する方法は次のとおりです。
Java
Python
Node.js
PHP
.NET
変換が利用可能かどうかを確認するには、ファイルを作成する前に about
リソースの importFormats
配列を確認します。サポートされている変換は、この配列で動的に利用できます。一般的なインポート形式は次のとおりです。
差出人 | 宛先 |
---|---|
Microsoft Word、OpenDocument テキスト、HTML、RTF、書式なしテキスト | Google ドキュメント |
Microsoft Excel、OpenDocument スプレッドシート、CSV、TSV、プレーン テキスト | Google スプレッドシート |
Microsoft PowerPoint、OpenDocument プレゼンテーション | Google スライド |
JPEG、PNG、GIF、BMP、PDF | Google ドキュメント(ドキュメントに画像を埋め込む) |
プレーン テキスト(特殊な MIME タイプ)、JSON | Google Apps Script |
update
リクエスト中にメディアをアップロードしてドキュメント、スプレッドシート、スライドのファイルに変換すると、ドキュメントのコンテンツ全体が置き換えられます。
画像をドキュメントに変換すると、ドライブは光学式文字認識(OCR)を使用して画像をテキストに変換します。ocrLanguage
パラメータで該当する BCP 47 言語コードを指定すると、OCR アルゴリズムの品質を向上させることができます。抽出されたテキストは、埋め込まれた画像の横に表示されます。
事前生成された ID を使用してファイルをアップロードする
Drive API を使用すると、リソースのアップロードと作成に使用される事前生成されたファイル ID のリストを取得できます。アップロード リクエストとファイル作成リクエストでは、これらの事前生成された ID を使用できます。ファイル メタデータの id
フィールドを設定します。
事前生成された ID を作成するには、作成する ID の数を指定して files.generateIds
を呼び出します。
サーバーエラーやタイムアウトが原因でアップロードが失敗した場合は、事前に生成された ID を使用して安全に再試行できます。ファイルが正常に作成された場合、後続の再試行では HTTP 409
エラーが返され、重複するファイルは作成されません。
不明なファイル形式のインデックス登録可能なテキストを定義する
ユーザーはドライブの UI を使用してドキュメントのコンテンツを見つけることができます。また、files.list
と fullText
フィールドを使用して、アプリのコンテンツを検索することもできます。詳しくは、ファイルとフォルダを検索するをご覧ください。
ドライブでは、テキスト ドキュメント、PDF、テキストを含む画像など、一般的なファイル形式が認識されると、検索用にドキュメントが自動的にインデックスに登録されます。アプリが他の種類のファイル(図面、動画、ショートカットなど)を保存する場合は、ファイルの contentHints.indexableText
フィールドにインデックス登録可能なテキストを指定することで、見つけやすさを向上させることができます。
インデックス登録可能なテキストの詳細については、ファイル メタデータを管理するをご覧ください。