Интеграция с функцией «Открыть с помощью» пользовательского интерфейса Drive. контекстное меню

Когда пользователь выбирает файл и нажимает пункт меню «Открыть с помощью» в пользовательском интерфейсе Google Диска , Диск перенаправляет пользователя на URL-адрес открытия файла этого приложения, определенный в разделе «Настройка интеграции с пользовательским интерфейсом Google Диска» .

Если при настройке интеграции с пользовательским интерфейсом Google Drive вы установили флажок «Импорт», пользователь может выбрать комбинацию файлов, специфичных для приложения, и файлов из Google Workspace для открытия. При настройке интеграции с пользовательским интерфейсом Google Drive файлы, специфичные для приложения, определяются в полях «Типы MIME по умолчанию» и «Расширения файлов по умолчанию», а файлы из Google Workspace — в полях «Дополнительные типы MIME» и «Дополнительные расширения файлов».

Для каждого файла, который пользователь хочет открыть, Google Drive проверяет MIME-типы на соответствие заданным вами MIME-типам по умолчанию и дополнительным MIME-типам:

  • Для MIME-типов, определенных в поле «MIME-типы по умолчанию», идентификатор файла передается вашему приложению. Информацию о том, как обрабатывать файлы, специфичные для приложения, см. в разделе «Обработка URL-адреса открытия для документов, специфичных для приложения» .

  • Для MIME-типов, определенных в поле «Вторичные MIME-типы», пользовательский интерфейс Google Диска отображает диалоговое окно, в котором пользователю предлагается выбрать тип файла для преобразования из файла Google Workspace. Например, если вы выберете файл Google Docs в пользовательском интерфейсе Google Диска, и поле «Вторичные MIME-типы» укажет, что ваше приложение поддерживает text/plain или application/pdf, пользовательский интерфейс Google Диска спросит пользователя, хочет ли он преобразовать файл в обычный текст или PDF.

    Информацию о работе с файлами Google Workspace см. в разделе «Обработка открытого URL-адреса для документов Google Workspace» . Список документов Google Workspace и форматов преобразования MIME-типов см. в разделе «Экспорт MIME-типов для документов Google Workspace» .

Обработка открытых URL-адресов для документов, специфичных для приложения.

Как упоминалось в разделе «Настройка интеграции с пользовательским интерфейсом Google Диска» , ваше приложение получает переменные шаблона с информацией для открытия файла. Ваше приложение получает набор переменных шаблона по умолчанию в параметре state . Информация state по умолчанию для URL-адреса открытия, специфичного для приложения, выглядит следующим образом:

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

В этот вывод включены следующие значения:

  • ID : Идентификатор родительской папки.
  • RESOURCE_KEYS : JSON-словарь идентификаторов файлов, сопоставленных с соответствующими ключами ресурсов.
  • open : Выполняемое действие. Значение open используется при использовании URL-адреса Open.
  • USER_ID : Идентификатор профиля, однозначно идентифицирующий пользователя.

Ваше приложение должно выполнить этот запрос, следуя этим шагам:

  1. Убедитесь, что поле action имеет значение open и поле ids присутствует.
  2. Используйте значение userId для создания новой сессии для пользователя. Дополнительную информацию о вошедших в систему пользователях см. в разделе «Пользователи и новые события» .
  3. Используйте метод files.get для проверки прав доступа, получения метаданных файла и загрузки содержимого файла с использованием значений ID .
  4. Если в запросе был указан параметр resourceKeys , установите заголовок запроса X-Goog-Drive-Resource-Keys . Дополнительную информацию о ключах ресурсов см. в разделе «Доступ к файлам, совместно используемым по ссылкам, с помощью ключей ресурсов» .

Параметр state кодируется в формате URL, поэтому ваше приложение должно обрабатывать экранирующие символы и интерпретировать его как JSON.

Обработка открытых URL-адресов для документов Google Workspace

Как упоминалось в разделе «Настройка интеграции пользовательского интерфейса Google Диска» , ваше приложение получает набор переменных шаблона по умолчанию в параметре state . Информация state по умолчанию для URL-адреса открытия рабочей области Google выглядит следующим образом:

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

В этот вывод включены следующие значения:

  • EXPORT_ID : Список идентификаторов экспортируемых файлов, разделенных запятыми. Используется только при открытии файлов Google Workspace.
  • RESOURCE_KEYS : JSON-словарь идентификаторов файлов, сопоставленных с соответствующими ключами ресурсов.
  • open : Выполняемое действие. Значение open используется при использовании URL-адреса Open.
  • USER_ID : Идентификатор профиля, который идентифицирует пользователя.

Ваше приложение должно выполнить этот запрос, следуя этим шагам:

  1. Убедитесь, что это запрос на открытие файла, проверив как значение поля state open ), так и наличие поля exportIds .

  2. Используйте метод files.get для проверки прав доступа, получения метаданных файла и определения MIME-типа с помощью значений EXPORT_ID .

  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
    import {GoogleAuth} from 'google-auth-library';
    import {google} from 'googleapis';
    
    /**
     * Exports a Google Doc as a PDF.
     * @param {string} fileId The ID of the file to export.
     * @return {Promise<number>} The status of the export request.
     */
    async function exportPdf(fileId) {
      // Authenticate with Google and get an authorized client.
      // TODO (developer): Use an appropriate auth mechanism for your app.
      const auth = new GoogleAuth({
        scopes: 'https://www.googleapis.com/auth/drive',
      });
    
      // Create a new Drive API client (v3).
      const service = google.drive({version: 'v3', auth});
    
      // Export the file as a PDF.
      const result = await service.files.export({
        fileId,
        mimeType: 'application/pdf',
      });
    
      // Print the status of the export.
      console.log(result.status);
      return result.status;
    }

    PHP

    drive/snippets/drive_v3/src/DriveExportPdf.php
    <?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 кодируется в формате URL, поэтому ваше приложение должно обрабатывать экранирующие символы и интерпретировать его как JSON.

Пользователи и новые события

Приложения Google Диска должны рассматривать все события "открыть с помощью" как потенциальные входы в систему. У некоторых пользователей может быть несколько учетных записей, поэтому идентификатор пользователя в параметре state может не совпадать с текущей сессией. Если идентификатор пользователя в параметре state не совпадает с текущей сессией, завершите текущую сессию для вашего приложения и войдите в систему под запрошенным пользователем.

Помимо открытия приложения из пользовательского интерфейса Google Drive, приложения могут отображать средство выбора файлов для выбора содержимого внутри приложения. Для получения дополнительной информации см. Google Picker .