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 de Open de esa app definida en Cómo configurar una integración de la IU de Drive.

Si marcaste la casilla "Importación" cuando configuraste una integración de la IU de Drive, el usuario puede seleccionar una combinación de archivos específicos de la app y de Google Workspace para abrirlos. Cuando configuras una integración de la 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 archivo secundarias".

Para cada archivo que el usuario quiera abrir, Drive verifica los tipos de MIME en función de los tipos de MIME predeterminados y secundarios que definiste:

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

  • En el caso de 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 desea 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 aplicación/pdf, la IU de Drive le pregunta al usuario si quiere realizar la conversión a texto sin formato o PDF.

    Para obtener información sobre cómo controlar archivos de Google Workspace, consulta Cómo controlar 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 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 Cómo configurar 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: Es el ID de la carpeta superior.
  • RESOURCE_KEYS: Es un diccionario JSON de IDs de archivos asignados a sus respectivas claves de recursos.
  • open: Es la acción que se está realizando. El valor es open cuando se usa una URL abierta.
  • USER_ID: Es el ID de perfil que identifica de forma única al usuario.

Para que tu app realice acciones en función de esta solicitud, sigue estos pasos:

  1. Verifica que el campo action tenga un valor de open y que el campo ids esté presente.
  2. Usa el valor userId para crear una sesión nueva para el usuario. Para obtener más información sobre los usuarios que accedieron, 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 con vínculos usando claves de recursos.

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

Cómo controlar una URL abierta para documentos de Google Workspace

Como se mencionó en Cómo configurar 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 los archivos que se exportarán (se usa solo cuando se abren documentos de Google integrados).
  • RESOURCE_KEYS: Es un diccionario JSON de IDs de archivos asignados a sus respectivas claves de recursos.
  • open: Es la acción que se está realizando. El valor es open cuando se usa una URL abierta.
  • USER_ID: Es el ID de perfil que identifica al usuario.

Para responder a esta solicitud, la app debe seguir estos pasos:

  1. Para verificar que se trata de una solicitud para abrir un archivo, 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 los metadatos del archivo y determinar el tipo de MIME con los valores EXPORT_ID.

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

  4. Si se configuró resourceKey en la solicitud, configura el encabezado de solicitud X-Goog-Drive-Resource-Keys. Para obtener más información sobre las claves de recursos, consulta Cómo acceder a archivos compartidos con vínculos usando 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 le permita al usuario guardar el archivo como el nuevo tipo de archivo.

El parámetro state está codificado en 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. Es posible que algunos usuarios tengan 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 la 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 desde una app. Para obtener más información, consulta el Selector de Google.