Intégrer à l'interface utilisateur Drive "Ouvrir avec le menu contextuel"

Lorsqu'un utilisateur sélectionne un fichier et clique sur l'élément de menu "Ouvrir avec" de l'UI Drive, Drive le redirige vers l'URL d'ouverture de cette application définie dans Configurer une intégration dans l'UI Drive.

Si vous avez coché la case "Importation" lors de la configuration d'une intégration dans l'UI Drive, l'utilisateur peut sélectionner une combinaison de fichiers spécifiques à l'application et Google Workspace à ouvrir. Lorsque vous configurez une intégration dans l'interface utilisateur Drive, les fichiers spécifiques à l'application sont définis dans les champs "Types MIME par défaut" et "Extensions de fichiers par défaut", tandis que les fichiers Google Workspace sont définis dans les champs "Types MIME secondaires" et "Extensions de fichiers secondaires".

Pour chaque fichier que l'utilisateur souhaite ouvrir, Drive compare les types MIME aux types MIME par défaut et secondaires que vous avez définis:

  • Pour les types MIME définis dans le champ "Types MIME par défaut", l'ID de fichier est transmis à votre application. Pour en savoir plus sur la gestion des fichiers spécifiques à une application, consultez Gérer une URL ouverte pour des documents spécifiques à une application.

  • Pour les types MIME définis dans le champ "Types MIME secondaires", l'interface utilisateur de Drive affiche une boîte de dialogue demandant à l'utilisateur quel type de fichier convertir le fichier Google Workspace. Par exemple, si vous sélectionnez un fichier Google Docs dans l'interface utilisateur de Drive et que le champ "Types MIME secondaires" suggère que votre application est compatible avec le format texte/brut ou application/pdf, l'interface utilisateur de Drive demande à l'utilisateur s'il souhaite le convertir en texte brut ou en PDF.

    Pour en savoir plus sur la gestion des fichiers Google Workspace, consultez Gérer une URL d'ouverture pour les documents Google Workspace. Pour obtenir la liste des documents Google Workspace et des formats de conversion des types MIME, consultez Exporter les types MIME pour les documents Google Workspace.

Gérer une URL ouverte pour les documents spécifiques à l'application

Comme indiqué dans la section Configurer une intégration de l'interface utilisateur Drive, votre application reçoit des variables de modèle contenant des informations permettant à votre application d'ouvrir le fichier. Votre application reçoit un ensemble de variables de modèle par défaut dans un paramètre state. Les informations state par défaut pour une URL à ouvrir spécifique à une application sont les suivantes:

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

Ce résultat inclut les valeurs suivantes :

  • ID: ID du dossier parent.
  • RESOURCE_KEYS: dictionnaire JSON d'ID de fichier mappés avec leurs clés de ressource respectives.
  • open: action en cours d'exécution La valeur est open lorsque vous utilisez une URL ouverte.
  • USER_ID: ID de profil permettant d'identifier l'utilisateur de manière unique.

Votre application doit répondre à cette demande en procédant comme suit:

  1. Vérifiez que la valeur du champ action est définie sur open et que le champ ids est présent.
  2. Utilisez la valeur userId afin de créer une session pour l'utilisateur. Pour en savoir plus sur les utilisateurs connectés, consultez Utilisateurs et nouveaux événements.
  3. Utilisez la méthode files.get pour vérifier les autorisations, récupérer les métadonnées des fichiers et télécharger le contenu du fichier à l'aide des valeurs ID.
  4. Si resourceKeys a été défini sur la requête, définissez l'en-tête de requête X-Goog-Drive-Resource-Keys. Pour en savoir plus sur les clés de ressource, consultez la section Accéder aux fichiers partagés par lien à l'aide de clés de ressource.

Le paramètre state est encodé en URL. Votre application doit donc gérer les caractères d'échappement et l'analyser au format JSON.

Gérer une URL d'ouverture pour les documents Google Workspace

Comme indiqué dans Configurer une intégration de l'UI Drive, votre application reçoit un ensemble par défaut de variables de modèle dans un paramètre state. Les informations state par défaut d'une URL à ouvrir Google Workspace sont les suivantes:

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

Ce résultat inclut les valeurs suivantes :

  • EXPORT_ID: liste des ID des fichiers exportés, séparés par une virgule (utilisé uniquement lors de l'ouverture des documents Google intégrés).
  • RESOURCE_KEYS: dictionnaire JSON d'ID de fichier mappés avec leurs clés de ressource respectives.
  • open: action en cours d'exécution La valeur est open lorsque vous utilisez une URL ouverte.
  • USER_ID: ID de profil permettant d'identifier l'utilisateur.

Votre application doit répondre à cette demande en procédant comme suit:

  1. Vérifiez qu'il s'agit d'une requête d'ouverture de fichier en détectant à la fois la valeur open dans le champ state et la présence du champ exportIds.

  2. Utilisez la méthode files.get pour vérifier les autorisations, récupérer les métadonnées des fichiers et déterminer le type MIME à l'aide des valeurs EXPORT_ID.

  3. Convertissez le contenu du fichier à l'aide de la méthode files.export. L'exemple de code suivant montre comment exporter un document Google Workspace vers le type MIME demandé.

  4. Si resourceKey a été défini sur la requête, définissez l'en-tête de requête X-Goog-Drive-Resource-Keys. Pour en savoir plus sur les clés de ressource, consultez la section Accéder aux fichiers partagés par lien à l'aide de clés de ressource.

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

Affichez les fichiers convertis en lecture seule ou présentez une boîte de dialogue permettant à l'utilisateur d'enregistrer le fichier en tant que nouveau type.

Le paramètre state est encodé en URL. Votre application doit donc gérer les caractères d'échappement et l'analyser au format JSON.

Utilisateurs et nouveaux événements

Les applications Drive doivent traiter tous les événements "ouvrir avec" comme des connexions potentielles. Certains utilisateurs peuvent posséder plusieurs comptes. Par conséquent, l'ID utilisateur dans le paramètre state peut ne pas correspondre à la session en cours. Si l'ID utilisateur dans le paramètre state ne correspond pas à la session en cours, mettez fin à la session en cours pour votre application et connectez-vous en tant qu'utilisateur demandé.

En plus d'ouvrir une application à partir de l'interface utilisateur Google Drive, les applications peuvent afficher un sélecteur de fichier pour sélectionner le contenu d'une application. Pour en savoir plus, consultez le sélecteur Google.