與雲端硬碟使用者介面整合's "開啟內容選單

當使用者選取檔案並按一下 雲端硬碟 UI 的「Open with」選單項目時,雲端硬碟會將使用者重新導向至「Configure a Drive UI integration」中定義的應用程式 Open URL。

如果您在設定雲端硬碟 UI 整合時勾選「匯入」方塊,使用者就能選取要開啟的應用程式專屬檔案和 Google Workspace 檔案組合。設定雲端硬碟 UI 整合時,應用程式專屬檔案會在「預設 MIME 類型」和「預設檔案副檔名」欄位中定義,而 Google Workspace 檔案則會在「次要 MIME 類型」和「次要檔案副檔名」欄位中定義。

針對使用者要開啟的每個檔案,雲端硬碟會根據您定義的預設和次要 MIME 類型,檢查 MIME 類型:

  • 如果在「預設 MIME 類型」欄位中定義的 MIME 類型,檔案 ID 會傳遞至應用程式。如要瞭解如何處理應用程式專屬檔案,請參閱「處理應用程式專屬文件的 Open URL」。

  • 如果是「次要 MIME 類型」欄位中定義的 MIME 類型,Google 雲端硬碟 UI 會顯示對話方塊,詢問使用者要將 Google Workspace 檔案轉換為哪種檔案類型。舉例來說,如果您在雲端硬碟 UI 中選取 Google 文件檔案,且「Secondary MIME types」欄位顯示應用程式支援 text/plain 或 application/pdf,雲端硬碟 UI 就會詢問使用者是否要將檔案轉換為純文字或 PDF。

    如要瞭解如何處理 Google Workspace 檔案,請參閱「處理 Google Workspace 文件的開啟網址」。如需 Google Workspace 文件和 MIME 類型轉換格式的清單,請參閱「匯出 Google Workspace 文件的 MIME 類型」。

處理應用程式專屬文件的 Open URL

設定 Drive UI 整合一文所述,應用程式會接收含有應用程式用來開啟檔案資訊的範本變數。應用程式會在 state 參數中收到一組預設的範本變數。特定應用程式開啟網址的預設 state 資訊如下:

{
  "ids": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

輸出內容包含下列值:

  • ID:父項資料夾的 ID。
  • RESOURCE_KEYS:檔案 ID 的 JSON 字典,已對應至各自的資源鍵。
  • open:執行的動作。使用 Open URL 時,這個值為 open
  • USER_ID:用於識別使用者的專屬設定檔 ID。

應用程式必須按照下列步驟處理這項要求:

  1. 確認 action 欄位的值為 open,且 ids 欄位存在。
  2. 使用 userId 值為使用者建立新工作階段。如要進一步瞭解已登入的使用者,請參閱「使用者與新事件」。
  3. 使用 files.get 方法檢查權限、擷取檔案中繼資料,並使用 ID 值下載檔案內容。
  4. 如果要求已設定 resourceKeys,請設定 X-Goog-Drive-Resource-Keys 要求標頭。如要進一步瞭解資源鍵,請參閱「使用資源鍵存取連結共用檔案」。

state 參數採用網址編碼,因此應用程式必須處理轉義字元,並將其解析為 JSON。

處理 Google Workspace 文件的開啟網址

設定 Drive UI 整合一文所述,應用程式會在 state 參數中接收預設的模板變數組合。Google Workspace 開放式網址的預設 state 資訊如下:

{
  "exportIds": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

輸出內容包含下列值:

  • EXPORT_ID:以半形逗號分隔的清單,其中包含要匯出的檔案 ID (僅限開啟內建 Google 文件時使用)。
  • RESOURCE_KEYS:檔案 ID 的 JSON 字典,已對應至各自的資源鍵。
  • open:執行的動作。使用 Open URL 時,這個值為 open
  • USER_ID:用於識別使用者的設定檔 ID。

應用程式必須按照下列步驟處理這項要求:

  1. 檢測 state 欄位中的 open 值,以及 exportIds 欄位的存在情形,確認這是開啟檔案的要求。

  2. 使用 files.get 方法檢查權限、擷取檔案中繼資料,並使用 EXPORT_ID 值判斷 MIME 類型。

  3. 使用 files.export 方法轉換檔案內容。以下程式碼範例說明如何將 Google Workspace 文件匯出至要求的 MIME 類型。

  4. 如果要求已設定 resourceKey,請設定 X-Goog-Drive-Resource-Keys 要求標頭。如要進一步瞭解資源鍵,請參閱「使用資源鍵存取連結共用檔案」。

    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;
        }
    
    }

將轉換後的檔案顯示為唯讀,或顯示對話方塊,讓使用者將檔案儲存為新檔案類型。

state 參數採用網址編碼,因此應用程式必須處理轉義字元,並將其解析為 JSON。

使用者和新事件

Drive 應用程式應將所有「開啟」事件視為潛在的登入事件。部分使用者可能擁有多個帳戶,因此 state 參數中的使用者 ID 可能與目前的工作階段不符。如果 state 參數中的使用者 ID 與目前的工作階段不符,請結束應用程式的目前工作階段,並以要求的使用者身分登入。

除了從 Google 雲端硬碟 UI 開啟應用程式,應用程式也可以顯示檔案選擇器,以便在應用程式中選取內容。詳情請參閱 Google Picker