Integracja z interfejsem Dysku „Otwórz za pomocą menu kontekstowego”

Gdy użytkownik wybierze plik i kliknie pozycję menu Dysku „Otwórz za pomocą”, Dysk przekieruje użytkownika do adresu URL aplikacji określonego w konfiguracji integracji interfejsu Dysku.

Jeśli podczas konfigurowania integracji z interfejsem Dysku zaznaczysz pole „Importowanie”, użytkownik będzie mógł otworzyć pliki z Dysku i z Google Workspace. Podczas konfigurowania integracji interfejsu Dysku pliki związane z aplikacjami są definiowane w polach „Domyślne typy MIME” i „Domyślne rozszerzenia plików”, a pliki Google Workspace w polach „Dodatkowe typy MIME” i „Dodatkowe rozszerzenia plików”.

W przypadku każdego pliku, który użytkownik chce otworzyć, Dysk porównuje typy MIME z Twoimi zdefiniowanymi domyślnymi i dodatkowymi typami MIME:

  • W przypadku typów MIME zdefiniowanych w polu „Domyślne typy MIME” identyfikator pliku jest przekazywany do aplikacji. Informacje o obsługiwaniu plików związanych z aplikacją znajdziesz w artykule Obsługa adresu URL do otwierania dokumentów związanych z aplikacją.

  • W przypadku typów MIME zdefiniowanych w polu „Dodatkowe typy MIME” interfejs Dysku wyświetla okno z pytaniem, na jaki typ pliku przekonwertować plik Google Workspace. Jeśli na przykład w interfejsie Dysku wybierzesz plik Dokumentów Google, a pole „Typy MIME pomocnicze” zasugeruje, że Twoja aplikacja obsługuje format text/plain lub application/pdf, interfejs Dysku zapyta użytkownika, czy chce przekonwertować plik na tekst zwykły czy PDF.

    Informacje o tym, jak obsługiwać pliki Google Workspace, znajdziesz w artykule Obsługa adresu URL otwierania dokumentów Google Workspace. Listę formatów dokumentów Google Workspace i typów MIME do konwersji znajdziesz w artykule Eksportowanie typów MIME dokumentów Google Workspace.

Obsługa adresu URL otwierania dokumentów w aplikacji

Jak wspomniano w artykule Konfigurowanie integracji z interfejsem Dysku, Twoja aplikacja otrzymuje zmienne szablonu z informacjami umożliwiającymi jej otwarcie pliku. Aplikacja otrzymuje domyślny zbiór zmiennych szablonu w ramach parametru state. Domyślne informacje state dotyczące otwierania adresu URL w aplikacji:

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

Dane wyjściowe zawierają te wartości:

  • ID: identyfikator folderu nadrzędnego.
  • RESOURCE_KEYS: słownik JSON z identyfikatorami plików powiązanymi z odpowiednimi kluczami zasobów.
  • open: wykonywane działanie. Gdy używasz adresu URL do otwierania, wartość to open.
  • USER_ID: identyfikator profilu, który jednoznacznie identyfikuje użytkownika.

Aplikacja musi wykonać tę prośbę, wykonując te czynności:

  1. Sprawdź, czy pole action ma wartość open, a pole ids jest obecne.
  2. Użyj wartości userId, aby utworzyć nową sesję dla użytkownika. Więcej informacji o zalogowanych użytkownikach znajdziesz w artykule Użytkownicy i nowe zdarzenia.
  3. Użyj metody files.get, aby sprawdzić uprawnienia, pobrać metadane pliku i pobrać zawartość pliku za pomocą wartości ID.
  4. Jeśli w żądaniu ustawiono wartość resourceKeys, ustaw nagłówek X-Goog-Drive-Resource-Keys. Więcej informacji o kluczach zasobów znajdziesz w artykule Uzyskiwanie dostępu do plików udostępnionych za pomocą linku za pomocą kluczy zasobów.

Parametr state jest zakodowany w formacie URL, więc aplikacja musi obsługiwać znaki ucieczki i analizować go jako dane JSON.

Obsługa adresu URL otwierania dokumentów Google Workspace

Jak wspomniano w artykule Konfigurowanie integracji z interfejsem Dysku, Twoja aplikacja otrzymuje domyślny zestaw zmiennych szablonu w parametrze state. Domyślne informacje state dla adresu URL otwierania Google Workspace to:

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

Dane wyjściowe zawierają te wartości:

  • EXPORT_ID: lista oddzielonych przecinkami identyfikatorów plików, które mają zostać wyeksportowane (używana tylko podczas otwierania wbudowanych dokumentów Google).
  • RESOURCE_KEYS: słownik JSON z identyfikatorami plików powiązanymi z odpowiednimi kluczami zasobów.
  • open: wykonywane działanie. Gdy używasz adresu URL do otwierania, wartość to open.
  • USER_ID: identyfikator profilu, który identyfikuje użytkownika.

Aplikacja musi wykonać tę prośbę, wykonując te czynności:

  1. Sprawdź, czy jest to prośba o otwarcie pliku, sprawdzając wartość open w polu state i obecność pola exportIds.

  2. Użyj metody files.get, aby sprawdzić uprawnienia, pobrać metadane pliku i określić typ MIME za pomocą wartości EXPORT_ID.

  3. Konwertuj zawartość pliku za pomocą metody files.export. Poniższy przykładowy kod pokazuje, jak wyeksportować dokument Google Workspace do żądanego typu MIME.

  4. Jeśli w żądaniu ustawiono wartość resourceKey, ustaw nagłówek X-Goog-Drive-Resource-Keys. Więcej informacji o kluczach zasobów znajdziesz w artykule Uzyskiwanie dostępu do plików udostępnionych za pomocą linku za pomocą kluczy zasobów.

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

Wyświetlać przekonwertowane pliki tylko do odczytu lub wyświetlać okno, które pozwala użytkownikowi zapisać plik jako nowy typ pliku.

Parametr state jest zakodowany w formacie URL, więc aplikacja musi obsługiwać znaki ucieczki i analizować go jako dane JSON.

Użytkownicy i nowe zdarzenia

Aplikacje Dysku powinny traktować wszystkie zdarzenia „otwieranie za pomocą” jako potencjalne logowanie. Niektórzy użytkownicy mogą mieć wiele kont, dlatego identyfikator użytkownika w parametrze state może nie pasować do bieżącej sesji. Jeśli identyfikator użytkownika w parametrze state nie pasuje do bieżącej sesji, zakończ bieżącą sesję aplikacji i zaloguj się jako żądany użytkownik.

Oprócz otwierania aplikacji z interfejsu Dysku Google aplikacje mogą wyświetlać selektor plików, aby umożliwić wybór treści z poziomu aplikacji. Więcej informacji znajdziesz w artykule Selektor Google.