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

Gdy użytkownik wybierze plik i kliknie pozycję menu „Otwórz za pomocą” w interfejsie Dysku, 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 typami domyślnymi i dodatkowymi:

  • W przypadku typów MIME zdefiniowanych w polu „Domyślne typy MIME” identyfikator pliku jest przekazywany do aplikacji. Informacje na temat obsługi plików w określonych aplikacjach znajdziesz w sekcji Obsługa adresu URL otwartego dla dokumentów aplikacji.

  • W przypadku typów MIME zdefiniowanych w polu „Dodatkowe typy MIME” w UI Dysku wyświetla się okno z pytaniem, na jaki typ pliku należy przekonwertować plik Google Workspace. Jeśli na przykład wybierzesz w interfejsie Dysku plik Dokumentów Google, a w polu „Dodatkowe typy MIME” pojawi się informacja, że aplikacja obsługuje tekst/zwykły lub aplikację/pdf, interfejs Dysku zapyta użytkownika, czy chce przekonwertować plik na zwykły tekst czy plik 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 przypadku 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 zestaw zmiennych szablonu w ramach parametru state. Domyślna informacja state w przypadku otwartego adresu URL określonej 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 zmapowanymi na odpowiednie klucze zasobów.
  • open: wykonywane działanie. W przypadku korzystania z otwartego adresu URL wartość to open.
  • USER_ID: identyfikator profilu, który jednoznacznie identyfikuje użytkownika.

W odpowiedzi na to żądanie Twoja aplikacja musi wykonać 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 nagłówek resourceKeys, ustaw nagłówek żądania 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 przetwarzać go jako dane JSON.

Obsługa otwartego adresu URL 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 adresu URL do 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: rozdzielana przecinkami lista identyfikatorów eksportowanych plików (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 żądanie otwarcia pliku – wykrywaj zarówno wartość open w polu state, jak 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świetlaj przekonwertowane pliki jako tylko do odczytu lub wyświetlaj okno, które pozwala użytkownikowi zapisać plik jako nowy typ.

Parametr state jest zakodowany na potrzeby adresu URL, dlatego aplikacja musi obsługiwać znaki zmiany znaczenia i przetwarzać je w formacie 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.