Integrar con el menú contextual "Abrir con" de la IU de Drive

Cuando un usuario selecciona un archivo y hace clic en el elemento de menú “Abrir con” de la IU de Drive, Drive redirecciona al usuario a la URL abierta de esa app definida en Configura una integración de la IU de Drive.

Si marcaste la casilla “Importación” cuando configuraste una integración de IU de Drive, el usuario puede seleccionar una combinación de archivos específicos de la app y de Google Workspace para abrir. Cuando configuras una integración de IU de Drive, los archivos específicos de la app se definen en los campos “Tipos de MIME predeterminados” y “Extensiones de archivo predeterminadas”, mientras que los archivos de Google Workspace se definen en los campos “Tipos de MIME secundarios” y “Extensiones de archivos secundarias”.

Para cada archivo que el usuario desea abrir, Drive compara los tipos de MIME con los tipos de MIME predeterminados y secundarios definidos:

  • En el caso de los tipos de MIME definidos en el campo "Tipos de MIME predeterminados", el ID del archivo se pasa a tu app. Si quieres obtener información para controlar archivos específicos de la app, consulta Cómo controlar una URL abierta para documentos específicos de la app.

  • Para los tipos de MIME definidos en el campo "Tipos de MIME secundarios", la IU de Drive muestra un diálogo en el que se le pregunta al usuario a qué tipo de archivo convertir el archivo de Google Workspace. Por ejemplo, si seleccionas un archivo de Documentos de Google en la IU de Drive y el campo "Tipos de MIME secundarios" sugiere que tu app admite texto/sin formato o application/pdf, la IU de Drive le preguntará al usuario si desea convertirlo en texto sin formato o PDF.

    Para obtener información sobre cómo controlar los archivos de Google Workspace, consulta Controla una URL abierta para documentos de Google Workspace. Para obtener una lista de los documentos de Google Workspace y los formatos de conversión de los tipos de MIME, consulta Exporta tipos de MIME para documentos de Google Workspace.

Controla una URL abierta para documentos específicos de la app

Como se mencionó en Configura una integración de la IU de Drive, tu app recibe variables de plantilla con información para que abra el archivo. Tu app recibe un conjunto predeterminado de variables de plantilla dentro de un parámetro state. La información predeterminada de state para una URL abierta específica de la app es la siguiente:

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

En esta salida, se incluyen los siguientes valores:

  • ID: El ID de la carpeta superior
  • RESOURCE_KEYS: Es un diccionario JSON de los ID de archivo asignados a sus respectivas claves de recursos.
  • open: Es la acción que se realiza. El valor es open cuando se usa una URL abierta.
  • USER_ID: Es el ID de perfil que identifica de forma única al usuario.

Tu app debe seguir estos pasos para responder a esta solicitud:

  1. Verifica que el campo action tenga un valor de open y que el campo ids esté presente.
  2. Usa el valor userId a fin de crear una sesión nueva para el usuario. Para obtener más información sobre los usuarios que accedieron a sus cuentas, consulta Usuarios y eventos nuevos.
  3. Usa el método files.get para verificar los permisos, recuperar metadatos del archivo y descargar el contenido del archivo con los valores ID.
  4. Si se configuró resourceKeys en la solicitud, configura el encabezado de la solicitud X-Goog-Drive-Resource-Keys. Para obtener más información sobre las claves de recursos, consulta Cómo acceder a archivos compartidos mediante vínculos mediante claves de recursos.

El parámetro state está codificado para URL, por lo que tu app debe controlar los caracteres de escape y analizarlo como JSON.

Controla una URL abierta para documentos de Google Workspace

Como se mencionó en Configura una integración de la IU de Drive, tu app recibe un conjunto predeterminado de variables de plantilla dentro de un parámetro state. La información predeterminada de state para una URL abierta de Google Workspace es la siguiente:

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

En esta salida, se incluyen los siguientes valores:

  • EXPORT_ID: Es una lista separada por comas de los IDs de archivos que se exportan (solo se usa cuando se abren documentos integrados de Google).
  • RESOURCE_KEYS: Es un diccionario JSON de los ID de archivo asignados a sus respectivas claves de recursos.
  • open: Es la acción que se realiza. El valor es open cuando se usa una URL abierta.
  • USER_ID: El ID del perfil que identifica al usuario.

Tu app debe seguir estos pasos para responder a esta solicitud:

  1. Verifica que se trate de una solicitud para abrir un archivo. Para ello, detecta el valor open en el campo state y la presencia del campo exportIds.

  2. Usa el método files.get para verificar los permisos, recuperar metadatos de archivos y determinar el tipo de MIME mediante los valores EXPORT_ID.

  3. Convierte el contenido del archivo con el método files.export. En la siguiente muestra de código, se indica cómo exportar un documento de Google Workspace al tipo de MIME solicitado.

  4. Si se configuró resourceKey en la solicitud, configura el encabezado de la solicitud X-Goog-Drive-Resource-Keys. Para obtener más información sobre las claves de recursos, consulta Cómo acceder a archivos compartidos mediante vínculos mediante claves de recursos.

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

Muestra los archivos convertidos como de solo lectura o presenta un diálogo que permita al usuario guardar el archivo como el tipo de archivo nuevo.

El parámetro state está codificado para URL, por lo que tu app debe controlar los caracteres de escape y analizarlo como JSON.

Usuarios y eventos nuevos

Las apps de Drive deben tratar todos los eventos "abiertos con" como posibles accesos. Algunos usuarios pueden tener varias cuentas, por lo que el ID de usuario en el parámetro state podría no coincidir con la sesión actual. Si el ID de usuario del parámetro state no coincide con la sesión actual, finaliza la sesión actual de tu app y accede como el usuario solicitado.

Además de abrir una aplicación desde la IU de Google Drive, las aplicaciones pueden mostrar un selector de archivos para seleccionar contenido dentro de una app. Si deseas obtener más información, consulta el selector de Google.