上傳檔案資料

Stay organized with collections Save and categorize content based on your preferences.

建立或更新 File 時,您可以透過 Google Drive API 上傳檔案。如要瞭解如何建立僅限中繼資料的 File,請參閱建立檔案

可上傳的影片類型有 3 種:

  • 簡易上傳 (uploadType=media) - 使用這個上傳類型來轉移小型媒體檔案 (大小為 5 MB 以下),而不提供中繼資料。如要執行簡單的上傳,請參閱執行簡易上傳

  • 多部分上傳 (uploadType=multipart):使用這種上傳類型,在單一要求中轉移小型檔案 (5 MB 以下) 及說明檔案的中繼資料。若要執行多部分上傳作業,請參閱執行多部分上傳

  • 支援繼續上傳 (uploadType=resumable):這個上傳類型適用於大型檔案 (大於 5MB),以及很有可能發生網路中斷的可能性 (例如透過行動應用程式建立檔案時)。在大多數應用程式中,續傳的上傳也是很理想的選擇,因為每次上傳只須花費少許 HTTP 要求,就能處理小型檔案。如要執行支援續傳的上傳作業,請參閱執行支援續傳的上傳作業

Google API 用戶端程式庫至少會實作下列其中一種類型的上傳。要進一步瞭解如何使用各個類型,請參閱用戶端程式庫說明文件

使用PATCHPUT

複習一下,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。如果您的檔案較小,但檔案中繼資料並不重要,則可使用簡易上傳。

執行多部分上傳作業

多部分上傳要求可讓您在相同的要求中上傳中繼資料和資料。如果您傳送的資料夠小,且因為連線失敗而重新上傳完整資料,請使用這個選項。

如要執行多部分上傳作業,請將 files.create 方法與 uploadType=multipart 搭配使用。

下面是如何執行多部分上傳作業:

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 fileMetadata = {
    name: 'photo.jpg',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  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/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 格式的檔案中繼資料。
    • 媒體。媒體必須第二,且其必須含有任何 MIME 類型的 Content-Type 標頭。將檔案檔案加進媒體部分。

    使用界線字串來標示各個部分,前面加上 2 個連字號。此外,請在最後一個邊界字串後方加上 2 個連字號,

  3. 新增下列頂層 HTTP 標頭:

    • Content-Type。請設為 multipart/related 並加入用來識別要求不同部分的邊界字串。例如:Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length。設定為要求主體中的位元組總數。
  4. 傳送要求。

如果只要建立或更新中繼資料部分,而不使用相關資料,請將 POSTPATCH 要求傳送至標準資源端點:https://www.googleapis.com/drive/v3/files 如果要求成功,伺服器會傳回 HTTP 200 OK 狀態碼和檔案的中繼資料。

建立檔案時,必須在檔案的 name 欄位中指定副檔名。舉例來說,當您建立相片 JPEG 檔案時,可以在中繼資料中指定 "name": "photo.jpg" 之類的內容。對 files.get 的後續呼叫會傳回原本在 name 欄位中指定的擴充功能的唯讀 fileExtension 屬性。

執行支援續傳的上傳作業

在通訊失敗中斷資料流後,支援續傳的上傳作業可讓您繼續執行上傳作業。您不一定要從頭開始上傳大型檔案,因此如果發生網路故障,可恢復的上傳也會降低頻寬用量。

如果您的檔案大小可能有大幅差異,或是要求有固定的時間限制 (例如行動作業系統背景工作和特定 App Engine 要求),支援續傳的上傳功能就相當實用。如想顯示上傳進度列,您也可以採用支援續傳的上傳作業。

支援續傳的上傳方式包含數個高階步驟:

  1. 傳送初始要求並擷取可恢復的工作階段 URI。
  2. 上傳資料並監控上傳狀態。
  3. (選用) 如果上傳作業中斷,請繼續進行上傳程序。

傳送初始要求

如要啟動可繼續的上傳作業,請使用 files.create 方法搭配 uploadType=resumable

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 會在一週後到期。

  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 會在一週後到期。

  5. 複製並儲存可繼續工作階段的網址。

  6. 前往上傳內容

上傳內容

您可以透過 2 種方式上傳採用可繼續工作階段的檔案:

  • 在單一要求中上傳內容:如果在單一要求中上傳檔案、沒有單一要求沒有固定的時間限制,或您不需要顯示上傳進度指標,請使用這個方法。這個方法最適合要求較少但效能更好的方法。
  • 將內容分成多個區塊:如果您必須減少單一要求中傳輸的資料量,請使用這個方法。當個別要求有固定的時間限制時,您可能需要減少某些資料傳輸次數,就像某些類別的 App Engine 要求一樣。如果您必須提供自訂指標來顯示上傳進度,這個方法也很實用。

HTTP - 單一要求

  1. 建立可繼續工作階段 URI 的 PUT 要求。
  2. 將檔案資料新增至要求主體。
  3. 新增 Content-Length HTTP 標頭,設定為檔案中的位元組數量。
  4. 傳送要求。如果上傳要求中斷,或是您收到 5xx 回應,請按照繼續中斷的上傳作業一文中的步驟進行。

HTTP - 多個要求

  1. 建立可繼續工作階段 URI 的 PUT 要求。

  2. 將區塊資料新增至要求主體。以 256 KB (256 x 1024 位元組) 的倍數建立區塊,但完成上傳的最終區塊除外。因此請盡可能保持區塊大小,以便提高上傳效率。

  3. 新增以下 HTTP 標頭:

    • Content-Length。設定為目前區塊中的位元組數。
    • Content-Range。設定為顯示上傳檔案中的位元組。舉例來說,Content-Range: bytes 0-524287/2000000 表示在 2,000,000 位元組檔案中,上傳了前 524,288 個位元組 (256 x 1024 x 2)。
  4. 傳送要求並處理回應。如果上傳要求中斷,或者收到 5xx 回應,請按照繼續中斷的上傳作業一文中的步驟進行。

  5. 為檔案內的每個區塊重複執行步驟 1 至步驟 4。請在回應中使用 Range 標頭來判斷下一個區塊要在哪裡。 請勿假設伺服器已收到前一項要求傳送的所有位元組。

檔案上傳完畢後,您會收到 200 OK201 Created 回應,以及與資源相關的任何中繼資料。

繼續執行中斷的上傳作業

如果上傳要求在回應之前終止,或者您收到 503 Service Unavailable 回應,則必須繼續進行中斷的上傳作業。

HTTP

  1. 如要要求上傳狀態,請為空白的工作階段 URI 建立空白的 PUT 要求。

  2. 新增 Content-Range 標頭,表示檔案中的目前位置不明。舉例來說,如果您的檔案總長度為 2,000,000 位元組,請將 Content-Range 設為 */2000000。如果您不知道檔案的完整大小,請將 Content-Range 設為 */*

  3. 傳送要求。

  4. 處理回應:

    • 200 OK201 Created 回應表示上傳已完成,您不需要採取進一步行動。
    • 308 Resume Incomplete 回應表示您需要繼續上傳檔案。
    • 404 Not Found 回應表示上傳工作階段已過期,且必須重新開始重新開始上傳。
  5. 如果您收到 308 Resume Incomplete 回應,請處理回應的 Range 標頭來判斷伺服器已收到的位元組。如果回應中沒有 Range 標頭,則沒有收到任何位元組。 例如,bytes=0-42Range 標頭表示已收到檔案的前 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 Workspace 檔案類型,例如 Google 文件或 Google 試算表。例如,您可能會想將自己喜愛的文書處理程式中的文件轉換為 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 陣列。在這個陣列中會動態提供支援的轉換。常見的匯入格式如下:

From傳送至
Microsoft Word、OpenDocument Text、HTML、RTF、純文字Google 文件
Microsoft Excel、OpenDocument Sheet、CSV、TSV、純文字Google 試算表
Microsoft PowerPoint、OpenDocument 簡報Google 簡報
JPEG、PNG、GIF、BMP、PDFGoogle 文件 (在文件中嵌入圖片)
純文字 (特殊 MIME 類型)、JSONGoogle Apps Script

當您在 update 要求上傳和轉換文件、試算表或簡報的媒體時,文件的完整內容會遭到取代。

將圖片轉換為文件時,雲端硬碟會使用光學字元辨識 (OCR) 將圖片轉換為文字。您可以在 ocrLanguage 參數中指定適用的 BCP 47 語言代碼,藉此提升 OCR 演算法的品質。擷取的文字會顯示在內嵌圖片的文件中。

使用系統自動產生的 ID 來上傳檔案

雲端硬碟 API 可讓您擷取預先產生的檔案 ID 清單,該清單 ID 用於上傳及建立資源。上傳和檔案建立要求可以使用這些預先產生的 ID。在檔案中繼資料中設定 id 欄位。

如要建立預先產生的 ID,請呼叫 file.generateIds 及要建立的 ID 數量。

只要伺服器發生錯誤或逾時,您可以放心地使用預先產生的 ID 重試上傳。如果檔案已成功建立,後續重試作業會傳回 HTTP 409 錯誤,且不會建立重複的檔案。

定義不明檔案類型的可建立索引文字

使用者可以透過雲端硬碟 UI 搜尋文件內容。您也可以使用 files.listfullText 欄位來搜尋應用程式的內容。詳情請參閱搜尋檔案和資料夾

當雲端硬碟識別出檔案類型 (包括文字文件、PDF、含有文字的圖片和其他常見類型文件) 時,雲端硬碟會自動為文件建立索引。如果您的應用程式儲存其他類型的檔案 (例如繪圖、影片和捷徑),您可以在檔案的 contentHints.indexableText 欄位中提供可建立索引的文字,藉此提升曝光率。

如要進一步瞭解可建立索引的文字,請參閱管理檔案中繼資料